From e276c87b182e8b325e4b3ed5737e9dc902d913be Mon Sep 17 00:00:00 2001 From: Juris Krikis Date: Tue, 7 Mar 2017 09:54:59 +0200 Subject: [PATCH 1/2] Fix contention due to lzycompute synchronised access --- shared/src/main/scala/scala/xml/MetaData.scala | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/shared/src/main/scala/scala/xml/MetaData.scala b/shared/src/main/scala/scala/xml/MetaData.scala index fed10618d..2d1218dc7 100644 --- a/shared/src/main/scala/scala/xml/MetaData.scala +++ b/shared/src/main/scala/scala/xml/MetaData.scala @@ -37,7 +37,7 @@ object MetaData { */ def normalize(attribs: MetaData, scope: NamespaceBinding): MetaData = { def iterate(md: MetaData, normalized_attribs: MetaData, set: Set[String]): MetaData = { - lazy val key = getUniversalKey(md, scope) + def key = getUniversalKey(md, scope) if (md eq Null) normalized_attribs else if ((md.value eq null) || set(key)) iterate(md.next, normalized_attribs, set) else md copy iterate(md.next, normalized_attribs, set + key) From 901c641c2a97a2aadf3475e79a7eb11a4575e8a3 Mon Sep 17 00:00:00 2001 From: Juris Krikis Date: Thu, 9 Mar 2017 11:16:54 +0200 Subject: [PATCH 2/2] Avoid duplicate getUniversalKey invocation --- shared/src/main/scala/scala/xml/MetaData.scala | 16 ++++++++++++---- 1 file changed, 12 insertions(+), 4 deletions(-) diff --git a/shared/src/main/scala/scala/xml/MetaData.scala b/shared/src/main/scala/scala/xml/MetaData.scala index 2d1218dc7..0997c31ca 100644 --- a/shared/src/main/scala/scala/xml/MetaData.scala +++ b/shared/src/main/scala/scala/xml/MetaData.scala @@ -37,10 +37,18 @@ object MetaData { */ def normalize(attribs: MetaData, scope: NamespaceBinding): MetaData = { def iterate(md: MetaData, normalized_attribs: MetaData, set: Set[String]): MetaData = { - def key = getUniversalKey(md, scope) - if (md eq Null) normalized_attribs - else if ((md.value eq null) || set(key)) iterate(md.next, normalized_attribs, set) - else md copy iterate(md.next, normalized_attribs, set + key) + if (md eq Null) { + normalized_attribs + } else if (md.value eq null) { + iterate(md.next, normalized_attribs, set) + } else { + val key = getUniversalKey(md, scope) + if (set(key)) { + iterate(md.next, normalized_attribs, set) + } else { + md copy iterate(md.next, normalized_attribs, set + key) + } + } } iterate(attribs, Null, Set()) }