From 68e9e267e63f13ce2e99843df989a1306f91cd19 Mon Sep 17 00:00:00 2001 From: Den Shabalin Date: Fri, 11 Oct 2013 20:25:26 +0200 Subject: use concurrent hash map with atomic integers This should ensure that concurrent access to the fresh name creator is properly synchronized. --- src/compiler/scala/reflect/macros/contexts/Names.scala | 4 ++-- .../scala/reflect/internal/util/FreshNameCreator.scala | 14 +++++--------- 2 files changed, 7 insertions(+), 11 deletions(-) (limited to 'src') diff --git a/src/compiler/scala/reflect/macros/contexts/Names.scala b/src/compiler/scala/reflect/macros/contexts/Names.scala index e535754a98..c2f14cf0f1 100644 --- a/src/compiler/scala/reflect/macros/contexts/Names.scala +++ b/src/compiler/scala/reflect/macros/contexts/Names.scala @@ -4,7 +4,7 @@ package contexts trait Names { self: Context => - lazy val freshNameCreator = callsiteTyper.context.unit.fresh + def freshNameCreator = callsiteTyper.context.unit.fresh def fresh(): String = freshName() @@ -16,7 +16,7 @@ trait Names { freshName[NameType](name) def freshName(): String = - freshNameCreator.newName() + freshName("fresh$") def freshName(name: String): String = freshNameCreator.newName(name) diff --git a/src/reflect/scala/reflect/internal/util/FreshNameCreator.scala b/src/reflect/scala/reflect/internal/util/FreshNameCreator.scala index c8347cfeaa..3e54de8e1e 100644 --- a/src/reflect/scala/reflect/internal/util/FreshNameCreator.scala +++ b/src/reflect/scala/reflect/internal/util/FreshNameCreator.scala @@ -6,12 +6,13 @@ package scala.reflect.internal package util +import java.util.concurrent.ConcurrentHashMap +import java.util.concurrent.atomic.AtomicLong import scala.collection.mutable import scala.reflect.NameTransformer class FreshNameCreator { - protected var counter = 0 - protected val counters = mutable.HashMap[String, Int]() withDefaultValue 0 + protected val counters = new ConcurrentHashMap[String, AtomicLong]() /** * Create a fresh name with the given prefix. It is guaranteed @@ -20,12 +21,7 @@ class FreshNameCreator { */ def newName(prefix: String): String = { val safePrefix = NameTransformer.encode(prefix) - counters(safePrefix) += 1 - safePrefix + counters(safePrefix) - } - - def newName(): String = { - counter += 1 - "$" + counter + "$" + counters.putIfAbsent(safePrefix, new AtomicLong(0)); + safePrefix + counters.get(safePrefix).incrementAndGet(); } } -- cgit v1.2.3