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 | |
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.
-rw-r--r-- | lib/forkjoin.jar.desired.sha1 | 2 | ||||
-rw-r--r-- | src/forkjoin/scala/concurrent/forkjoin/ForkJoinTask.java | 21 |
2 files changed, 17 insertions, 6 deletions
diff --git a/lib/forkjoin.jar.desired.sha1 b/lib/forkjoin.jar.desired.sha1 index bb3457d9f4..758ecb4baf 100644 --- a/lib/forkjoin.jar.desired.sha1 +++ b/lib/forkjoin.jar.desired.sha1 @@ -1 +1 @@ -0cfd64e466a576594ea8d5e5a191f0f7bd3184ea ?forkjoin.jar +12c479a33ee283599fdb7aa91d6a1df0197a52cf ?forkjoin.jar 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; } } |