From f139afb941513aa41bf077b4aa2391443ad4db46 Mon Sep 17 00:00:00 2001 From: Philipp Haller Date: Wed, 19 May 2010 17:36:37 +0000 Subject: 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. --- .../scala/concurrent/forkjoin/ForkJoinTask.java | 21 ++++++++++++++++----- 1 file changed, 16 insertions(+), 5 deletions(-) (limited to 'src') 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 implements Future, 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 implements Future, 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; } } -- cgit v1.2.3