summaryrefslogtreecommitdiff
path: root/src/forkjoin
diff options
context:
space:
mode:
authorPhilipp Haller <hallerp@gmail.com>2010-05-19 17:36:37 +0000
committerPhilipp Haller <hallerp@gmail.com>2010-05-19 17:36:37 +0000
commitf139afb941513aa41bf077b4aa2391443ad4db46 (patch)
tree41446020a11bddf803271db2008cb72458bd575c /src/forkjoin
parent7df797939b9e84c720e6b517c774d380d66ae28d (diff)
downloadscala-f139afb941513aa41bf077b4aa2391443ad4db46.tar.gz
scala-f139afb941513aa41bf077b4aa2391443ad4db46.tar.bz2
scala-f139afb941513aa41bf077b4aa2391443ad4db46.zip
Fixed problem with static initializer in ForkJo...
Fixed problem with static initializer in ForkJoinTask on Android. Replaces forkjoin.jar. Addresses see #3359. Review by plocinic.
Diffstat (limited to 'src/forkjoin')
-rw-r--r--src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java21
1 files changed, 16 insertions, 5 deletions
diff --git a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java
index e6c0fa7bb4..dc1a6bcccc 100644
--- a/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java
+++ b/src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java
@@ -1031,9 +1031,10 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
return (Unsafe) f.get(null);
}
- private static long fieldOffset(String fieldName)
+ private static long fieldOffset(String fieldName, Unsafe unsafe)
throws NoSuchFieldException {
- return _unsafe.objectFieldOffset
+ // do not use _unsafe to avoid NPE
+ return unsafe.objectFieldOffset
(ForkJoinTask.class.getDeclaredField(fieldName));
}
@@ -1041,12 +1042,22 @@ public abstract class ForkJoinTask<V> implements Future<V>, Serializable {
static final long statusOffset;
static {
+ Unsafe tmpUnsafe = null;
+ long tmpStatusOffset = 0;
try {
- _unsafe = getUnsafe();
- statusOffset = fieldOffset("status");
+ tmpUnsafe = getUnsafe();
+ tmpStatusOffset = fieldOffset("status", tmpUnsafe);
} catch (Throwable e) {
- throw new RuntimeException("Could not initialize intrinsics", e);
+ // Ignore the failure to load sun.misc.Unsafe on Android so
+ // that platform can use the actor library without the
+ // fork/join scheduler.
+ String vmVendor = System.getProperty("java.vm.vendor");
+ if (!vmVendor.contains("Android")) {
+ throw new RuntimeException("Could not initialize intrinsics", e);
+ }
}
+ _unsafe = tmpUnsafe;
+ statusOffset = tmpStatusOffset;
}
}