diff options
author | Philipp Haller <hallerp@gmail.com> | 2010-05-19 17:36:37 +0000 |
---|---|---|
committer | Philipp Haller <hallerp@gmail.com> | 2010-05-19 17:36:37 +0000 |
commit | f139afb941513aa41bf077b4aa2391443ad4db46 (patch) | |
tree | 41446020a11bddf803271db2008cb72458bd575c /src/forkjoin | |
parent | 7df797939b9e84c720e6b517c774d380d66ae28d (diff) | |
download | scala-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.java | 21 |
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; } } |