src/share/classes/java/util/concurrent/ForkJoinPool.java

Print this page




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 }