summaryrefslogtreecommitdiff
path: root/src/actors
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2008-02-13 16:19:11 +0000
committerPhilipp Haller <hallerp@gmail.com>2008-02-13 16:19:11 +0000
commit0fb6357fa686f87d409a62e38dbb5a835faeb892 (patch)
tree754888a261ce061cfba55445f3d74c073d9de108 /src/actors
parenta9ce75094658fa546d50d64e27e34c145d1a7b62 (diff)
downloadscala-0fb6357fa686f87d409a62e38dbb5a835faeb892.tar.gz
scala-0fb6357fa686f87d409a62e38dbb5a835faeb892.tar.bz2
scala-0fb6357fa686f87d409a62e38dbb5a835faeb892.zip
Using custom ClassLoader is more robust.
Diffstat (limited to 'src/actors')
-rw-r--r--src/actors/scala/actors/remote/JavaSerializer.scala12
-rw-r--r--src/actors/scala/actors/remote/RemoteActor.scala20
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)
+ }
}