diff --git a/src/main/scala/scalang/Node.scala b/src/main/scala/scalang/Node.scala index c2d7400..ed14942 100644 --- a/src/main/scala/scalang/Node.scala +++ b/src/main/scala/scalang/Node.scala @@ -184,6 +184,26 @@ trait Node extends ClusterListener with ClusterPublisher { def timer : HashedWheelTimer } +object ErlangNode { + + def newConcurrentMap[K,V](config : NodeConfig): ConcurrentMap[K,V] = { + if (config.useNBHM) { + new NonBlockingHashMap[K,V] + } else { + new ConcurrentHashMap[K,V] + } + } + + def newAtomicMap[K,V](config : NodeConfig): AtomicMap[K,V] = { + if (config.useNBHM) { + AtomicMap.atomicNBHM[K,V] + } else { + AtomicMap.atomicCHM[K,V] + } + } + +} + class ErlangNode(val name : Symbol, val cookie : String, config : NodeConfig) extends Node with ExitListener with SendListener @@ -198,11 +218,11 @@ class ErlangNode(val name : Symbol, val cookie : String, config : NodeConfig) ex val tickTime = config.tickTime val poolFactory = config.poolFactory var creation : Int = 0 - val processes = new NonBlockingHashMap[Pid,ProcessAdapter] - val registeredNames = new NonBlockingHashMap[Symbol,Pid] - val channels = AtomicMap.atomicNBHM[Symbol,Channel] - val links = AtomicMap.atomicNBHM[Channel,NonBlockingHashSet[Link]] - val monitors = AtomicMap.atomicNBHM[Channel,NonBlockingHashSet[Monitor]] + val processes = ErlangNode.newConcurrentMap[Pid,ProcessAdapter](config) + val registeredNames = ErlangNode.newConcurrentMap[Symbol,Pid](config) + val channels = ErlangNode.newAtomicMap[Symbol,Channel](config) + val links = ErlangNode.newAtomicMap[Channel,NonBlockingHashSet[Link]](config) + val monitors = ErlangNode.newAtomicMap[Channel,NonBlockingHashSet[Monitor]](config) val pidCount = new AtomicInteger(0) val pidSerial = new AtomicInteger(0) val executor = poolFactory.createActorPool diff --git a/src/main/scala/scalang/NodeConfig.scala b/src/main/scala/scalang/NodeConfig.scala index 75cdd1d..dea35da 100644 --- a/src/main/scala/scalang/NodeConfig.scala +++ b/src/main/scala/scalang/NodeConfig.scala @@ -24,7 +24,8 @@ case class NodeConfig( typeFactory : TypeFactory = NoneTypeFactory, typeEncoder: TypeEncoder = NoneTypeEncoder, typeDecoder : TypeDecoder = NoneTypeDecoder, - tickTime : Int = 60) + tickTime : Int = 60, + useNBHM: Boolean = true) object NoneTypeFactory extends TypeFactory { def createType(name : Symbol, arity : Int, reader : TermReader) = None