2133 // Unsafe mechanics 2134 private static final sun.misc.Unsafe UNSAFE; 2135 private static final long ctlOffset; 2136 private static final long stealCountOffset; 2137 private static final long blockedCountOffset; 2138 private static final long quiescerCountOffset; 2139 private static final long scanGuardOffset; 2140 private static final long nextWorkerNumberOffset; 2141 private static final long ABASE; 2142 private static final int ASHIFT; 2143 2144 static { 2145 poolNumberGenerator = new AtomicInteger(); 2146 workerSeedGenerator = new Random(); 2147 modifyThreadPermission = new RuntimePermission("modifyThread"); 2148 defaultForkJoinWorkerThreadFactory = 2149 new DefaultForkJoinWorkerThreadFactory(); 2150 int s; 2151 try { 2152 UNSAFE = sun.misc.Unsafe.getUnsafe(); 2153 Class k = ForkJoinPool.class; 2154 ctlOffset = UNSAFE.objectFieldOffset 2155 (k.getDeclaredField("ctl")); 2156 stealCountOffset = UNSAFE.objectFieldOffset 2157 (k.getDeclaredField("stealCount")); 2158 blockedCountOffset = UNSAFE.objectFieldOffset 2159 (k.getDeclaredField("blockedCount")); 2160 quiescerCountOffset = UNSAFE.objectFieldOffset 2161 (k.getDeclaredField("quiescerCount")); 2162 scanGuardOffset = UNSAFE.objectFieldOffset 2163 (k.getDeclaredField("scanGuard")); 2164 nextWorkerNumberOffset = UNSAFE.objectFieldOffset 2165 (k.getDeclaredField("nextWorkerNumber")); 2166 Class a = ForkJoinTask[].class; 2167 ABASE = UNSAFE.arrayBaseOffset(a); 2168 s = UNSAFE.arrayIndexScale(a); 2169 } catch (Exception e) { 2170 throw new Error(e); 2171 } 2172 if ((s & (s-1)) != 0) 2173 throw new Error("data type scale not a power of two"); 2174 ASHIFT = 31 - Integer.numberOfLeadingZeros(s); 2175 } 2176 2177 } | 2133 // Unsafe mechanics 2134 private static final sun.misc.Unsafe UNSAFE; 2135 private static final long ctlOffset; 2136 private static final long stealCountOffset; 2137 private static final long blockedCountOffset; 2138 private static final long quiescerCountOffset; 2139 private static final long scanGuardOffset; 2140 private static final long nextWorkerNumberOffset; 2141 private static final long ABASE; 2142 private static final int ASHIFT; 2143 2144 static { 2145 poolNumberGenerator = new AtomicInteger(); 2146 workerSeedGenerator = new Random(); 2147 modifyThreadPermission = new RuntimePermission("modifyThread"); 2148 defaultForkJoinWorkerThreadFactory = 2149 new DefaultForkJoinWorkerThreadFactory(); 2150 int s; 2151 try { 2152 UNSAFE = sun.misc.Unsafe.getUnsafe(); 2153 Class<?> k = ForkJoinPool.class; 2154 ctlOffset = UNSAFE.objectFieldOffset 2155 (k.getDeclaredField("ctl")); 2156 stealCountOffset = UNSAFE.objectFieldOffset 2157 (k.getDeclaredField("stealCount")); 2158 blockedCountOffset = UNSAFE.objectFieldOffset 2159 (k.getDeclaredField("blockedCount")); 2160 quiescerCountOffset = UNSAFE.objectFieldOffset 2161 (k.getDeclaredField("quiescerCount")); 2162 scanGuardOffset = UNSAFE.objectFieldOffset 2163 (k.getDeclaredField("scanGuard")); 2164 nextWorkerNumberOffset = UNSAFE.objectFieldOffset 2165 (k.getDeclaredField("nextWorkerNumber")); 2166 Class<?> a = ForkJoinTask[].class; 2167 ABASE = UNSAFE.arrayBaseOffset(a); 2168 s = UNSAFE.arrayIndexScale(a); 2169 } catch (Exception e) { 2170 throw new Error(e); 2171 } 2172 if ((s & (s-1)) != 0) 2173 throw new Error("data type scale not a power of two"); 2174 ASHIFT = 31 - Integer.numberOfLeadingZeros(s); 2175 } 2176 2177 } |