|
37 | 37 | import com.oracle.svm.core.SubstrateUtil;
|
38 | 38 | import com.oracle.svm.core.annotate.Alias;
|
39 | 39 | import com.oracle.svm.core.annotate.Inject;
|
| 40 | +import com.oracle.svm.core.annotate.InjectAccessors; |
40 | 41 | import com.oracle.svm.core.annotate.RecomputeFieldValue;
|
41 | 42 | import com.oracle.svm.core.annotate.RecomputeFieldValue.Kind;
|
42 | 43 | import com.oracle.svm.core.annotate.Substitute;
|
@@ -150,6 +151,46 @@ final class Target_java_util_concurrent_ConcurrentHashMap {
|
150 | 151 | @Alias @RecomputeFieldValue(kind = RecomputeFieldValue.Kind.Reset)//
|
151 | 152 | Target_java_util_concurrent_ConcurrentHashMap_EntrySetView entrySet;
|
152 | 153 |
|
| 154 | + @Alias @InjectAccessors(NCPUAccessor.class) // |
| 155 | + private static int NCPU; |
| 156 | +} |
| 157 | + |
| 158 | +final class NCPUAccessor { |
| 159 | + private static int cachedNCPU = -1; |
| 160 | + |
| 161 | + static int get() { |
| 162 | + if (cachedNCPU != -1) { |
| 163 | + return cachedNCPU; |
| 164 | + } |
| 165 | + return initializeNCPU(); |
| 166 | + } |
| 167 | + |
| 168 | + private static synchronized int initializeNCPU() { |
| 169 | + if (cachedNCPU != -1) { |
| 170 | + return cachedNCPU; |
| 171 | + } |
| 172 | + |
| 173 | + cachedNCPU = Runtime.getRuntime().availableProcessors(); |
| 174 | + return cachedNCPU; |
| 175 | + } |
| 176 | + |
| 177 | + static synchronized void set(int value) { |
| 178 | + cachedNCPU = value; |
| 179 | + } |
| 180 | +} |
| 181 | + |
| 182 | +@TargetClass(java.util.concurrent.Phaser.class) |
| 183 | +final class Target_java_util_concurrent_Phaser { |
| 184 | + |
| 185 | + @Alias @InjectAccessors(NCPUAccessor.class) // |
| 186 | + private static int NCPU; |
| 187 | +} |
| 188 | + |
| 189 | +@TargetClass(className = "java.util.concurrent.atomic.Striped64") |
| 190 | +final class Target_java_util_concurrent_atomic_Striped64 { |
| 191 | + |
| 192 | + @Alias @InjectAccessors(NCPUAccessor.class) // |
| 193 | + private static int NCPU; |
153 | 194 | }
|
154 | 195 |
|
155 | 196 | @TargetClass(value = java.util.concurrent.ConcurrentHashMap.class, innerClass = "KeySetView")
|
@@ -289,6 +330,37 @@ public boolean getAsBoolean() {
|
289 | 330 | }
|
290 | 331 | }
|
291 | 332 |
|
| 333 | +@TargetClass(className = "java.util.concurrent.LinkedTransferQueue", innerClass = "DualNode") |
| 334 | +final class Target_java_util_concurrent_LinkedTransferQueue_DualNode { |
| 335 | + |
| 336 | + @Alias @InjectAccessors(LinkedTransferQueueDualNodeIsUniprocessorAccessor.class) // |
| 337 | + private static boolean isUniprocessor; |
| 338 | +} |
| 339 | + |
| 340 | +final class LinkedTransferQueueDualNodeIsUniprocessorAccessor { |
| 341 | + private static Boolean cachedIsUniprocessor = null; |
| 342 | + |
| 343 | + static boolean get() { |
| 344 | + if (cachedIsUniprocessor != null) { |
| 345 | + return cachedIsUniprocessor; |
| 346 | + } |
| 347 | + return initializeIsUniprocessor(); |
| 348 | + } |
| 349 | + |
| 350 | + static void set(boolean value) { |
| 351 | + cachedIsUniprocessor = value; |
| 352 | + } |
| 353 | + |
| 354 | + private static synchronized boolean initializeIsUniprocessor() { |
| 355 | + if (cachedIsUniprocessor != null) { |
| 356 | + return cachedIsUniprocessor; |
| 357 | + } |
| 358 | + |
| 359 | + cachedIsUniprocessor = Runtime.getRuntime().availableProcessors() == 1; |
| 360 | + return cachedIsUniprocessor; |
| 361 | + } |
| 362 | +} |
| 363 | + |
292 | 364 | /** Dummy class to have a class with the file's name. */
|
293 | 365 | public final class JavaUtilSubstitutions {
|
294 | 366 | }
|
0 commit comments