diff options
-rw-r--r-- | src/actors/scala/actors/remote/JavaSerializer.scala | 12 | ||||
-rw-r--r-- | src/actors/scala/actors/remote/RemoteActor.scala | 20 |
2 files changed, 26 insertions, 6 deletions
diff --git a/src/actors/scala/actors/remote/JavaSerializer.scala b/src/actors/scala/actors/remote/JavaSerializer.scala index ec1f0181ce..1d78c120c5 100644 --- a/src/actors/scala/actors/remote/JavaSerializer.scala +++ b/src/actors/scala/actors/remote/JavaSerializer.scala @@ -17,7 +17,7 @@ import java.io.{ByteArrayInputStream, ByteArrayOutputStream, /** * @author Guy Oliver */ -class CustomObjectInputStream(os: InputStream, val cl: ClassLoader) extends ObjectInputStream(os) { +class CustomObjectInputStream(os: InputStream, cl: ClassLoader) extends ObjectInputStream(os) { override def resolveClass(cd: ObjectStreamClass): Class[T] forSome { type T } = try { cl.loadClass(cd.getName()) @@ -30,7 +30,7 @@ class CustomObjectInputStream(os: InputStream, val cl: ClassLoader) extends Obje /** * @author Philipp Haller */ -class JavaSerializer(serv: Service, val cl: ClassLoader) extends Serializer(serv) { +class JavaSerializer(serv: Service, cl: ClassLoader) extends Serializer(serv) { def serialize(o: AnyRef): Array[Byte] = { val bos = new ByteArrayOutputStream() val out = new ObjectOutputStream(bos) @@ -41,7 +41,13 @@ class JavaSerializer(serv: Service, val cl: ClassLoader) extends Serializer(serv def deserialize(bytes: Array[Byte]): AnyRef = { val bis = new ByteArrayInputStream(bytes) - val in = new CustomObjectInputStream(bis, cl) + + // use custom stream only if cl != null + val in = if (cl != null) + new CustomObjectInputStream(bis, cl) + else + new ObjectInputStream(bis) + in.readObject() } } diff --git a/src/actors/scala/actors/remote/RemoteActor.scala b/src/actors/scala/actors/remote/RemoteActor.scala index c363079505..62d983a25d 100644 --- a/src/actors/scala/actors/remote/RemoteActor.scala +++ b/src/actors/scala/actors/remote/RemoteActor.scala @@ -45,7 +45,17 @@ object RemoteActor { private val kernels = new scala.collection.mutable.HashMap[Actor, NetKernel] - private var cl: ClassLoader = ClassLoader.getSystemClassLoader() + private var cl: ClassLoader = try { + ClassLoader.getSystemClassLoader() + } catch { + case sec: SecurityException => + Debug.info(this+": caught "+sec) + null + case ise: IllegalStateException => + Debug.info(this+": caught "+ise) + null + } + def classLoader: ClassLoader = cl def classLoader_=(x: ClassLoader) { cl = x } @@ -65,8 +75,11 @@ object RemoteActor { Scheduler.onTerminate(s) { Debug.info("alive actor "+s+" terminated") + // remove mapping for `s` kernels -= s - if (kernels.isEmpty) { + // terminate `kern` when it does + // not appear as value any more + if (!kernels.values.contains(kern)) { Debug.info("terminating "+kern) // terminate NetKernel kern.terminate() @@ -106,8 +119,9 @@ object RemoteActor { * Returns (a proxy for) the actor registered under * <code>name</code> on <code>node</code>. */ - def select(node: Node, sym: Symbol): Actor = + def select(node: Node, sym: Symbol): Actor = synchronized { selfKernel.getOrCreateProxy(node, sym) + } } |