Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
PojavLauncherTeam
GitHub Repository: PojavLauncherTeam/openj9
Path: blob/master/runtime/gc_modron_startup/mmparseXXgc.cpp
5986 views
1
/*******************************************************************************
2
* Copyright (c) 1991, 2022 IBM Corp. and others
3
*
4
* This program and the accompanying materials are made available under
5
* the terms of the Eclipse Public License 2.0 which accompanies this
6
* distribution and is available at https://www.eclipse.org/legal/epl-2.0/
7
* or the Apache License, Version 2.0 which accompanies this distribution and
8
* is available at https://www.apache.org/licenses/LICENSE-2.0.
9
*
10
* This Source Code may also be made available under the following
11
* Secondary Licenses when the conditions for such availability set
12
* forth in the Eclipse Public License, v. 2.0 are satisfied: GNU
13
* General Public License, version 2 with the GNU Classpath
14
* Exception [1] and GNU General Public License, version 2 with the
15
* OpenJDK Assembly Exception [2].
16
*
17
* [1] https://www.gnu.org/software/classpath/license.html
18
* [2] http://openjdk.java.net/legal/assembly-exception.html
19
*
20
* SPDX-License-Identifier: EPL-2.0 OR Apache-2.0 OR GPL-2.0 WITH Classpath-exception-2.0 OR LicenseRef-GPL-2.0 WITH Assembly-exception
21
*******************************************************************************/
22
23
/**
24
* @file
25
* @ingroup GC_Modron_Startup
26
*/
27
28
#include "j9.h"
29
#include "j9cfg.h"
30
#include "j9protos.h"
31
#include "j9consts.h"
32
#include "jni.h"
33
#include "jvminit.h"
34
#include "j9port.h"
35
#include "modronnls.h"
36
#include "gcutils.h"
37
38
#include "mmparse.h"
39
40
#include "GCExtensions.hpp"
41
#if defined(J9VM_GC_REALTIME)
42
#include "Scheduler.hpp"
43
#endif /* J9VM_GC_REALTIME */
44
#include "Wildcard.hpp"
45
46
/**
47
* Parse the command line looking for private GC options.
48
* @params optArg string to be parsed
49
*/
50
jint
51
gcParseXXgcArguments(J9JavaVM *vm, char *optArg)
52
{
53
char *scan_start = optArg;
54
char *scan_limit = optArg + strlen(optArg);
55
char *error_scan;
56
MM_GCExtensions *extensions;
57
PORT_ACCESS_FROM_JAVAVM(vm);
58
59
extensions = MM_GCExtensions::getExtensions(vm);
60
61
jint returnValue = JNI_OK;
62
63
while (scan_start < scan_limit) {
64
/* ignore separators */
65
try_scan(&scan_start, ",");
66
67
error_scan = scan_start;
68
69
#if defined(J9VM_GC_REALTIME)
70
if (try_scan(&scan_start, "beatsPerMeasure=")) {
71
if(!scan_udata_helper(vm, &scan_start, &(extensions->beatMicro), "beatsPerMeasure=")) {
72
returnValue = JNI_EINVAL;
73
break;
74
}
75
continue;
76
}
77
78
if (try_scan(&scan_start, "perfTraceSocket=")) {
79
continue;
80
}
81
if (try_scan(&scan_start, "perfTraceLog=")) {
82
continue;
83
}
84
if (try_scan(&scan_start, "debug=")) {
85
if (scan_udata(&scan_start, &(extensions->debug))) {
86
returnValue = JNI_EINVAL;
87
break;
88
}
89
continue;
90
}
91
if (try_scan(&scan_start, "debugWriteBarrier=")) {
92
if(!scan_udata_helper(vm, &scan_start, &(extensions->debugWriteBarrier), "debugWriteBarrier=")) {
93
returnValue = JNI_EINVAL;
94
break;
95
}
96
continue;
97
}
98
if (try_scan(&scan_start, "tuningFork")) {
99
continue;
100
}
101
if (try_scan(&scan_start, "stw")) {
102
MM_Scheduler::initializeForVirtualSTW(extensions);
103
/* Stop the world collects should not do any concurrent work */
104
extensions->concurrentSweepingEnabled = false;
105
extensions->concurrentTracingEnabled = false;
106
continue;
107
}
108
if (try_scan(&scan_start, "headroom=")) {
109
if(!scan_udata_memory_size_helper(vm, &scan_start, &(extensions->headRoom), "headroom=")) {
110
returnValue = JNI_EINVAL;
111
break;
112
}
113
continue;
114
}
115
if (try_scan(&scan_start, "minimumFreeEntrySize=")) {
116
if(!scan_udata_memory_size_helper(vm, &scan_start, &(extensions->minimumFreeEntrySize), "minimumFreeEntrySize=")) {
117
returnValue = JNI_EINVAL;
118
break;
119
}
120
continue;
121
}
122
if (try_scan(&scan_start, "traceCostToCheckYield=")) {
123
if(!scan_udata_memory_size_helper(vm, &scan_start, &(extensions->traceCostToCheckYield), "traceCostToCheckYield=")) {
124
returnValue = JNI_EINVAL;
125
break;
126
}
127
continue;
128
}
129
if (try_scan(&scan_start, "sweepCostToCheckYield=")) {
130
if(!scan_udata_memory_size_helper(vm, &scan_start, &(extensions->sweepCostToCheckYield), "sweepCostToCheckYield=")) {
131
returnValue = JNI_EINVAL;
132
break;
133
}
134
continue;
135
}
136
if (try_scan(&scan_start, "verbose=")) {
137
if(!scan_udata_helper(vm, &scan_start, &(extensions->verbose), "verbose=")) {
138
returnValue = JNI_EINVAL;
139
break;
140
}
141
continue;
142
}
143
if (try_scan(&scan_start, "trigger=")) {
144
if(!scan_udata_memory_size_helper(vm, &scan_start, &extensions->gcInitialTrigger, "trigger=")) {
145
returnValue = JNI_EINVAL;
146
break;
147
}
148
149
extensions->gcTrigger = extensions->gcInitialTrigger;
150
continue;
151
}
152
if (try_scan(&scan_start, "timeInterval=")) {
153
if(!scan_udata_helper(vm, &scan_start, &(extensions->timeWindowMicro), "timeInterval=")) {
154
returnValue = JNI_EINVAL;
155
break;
156
}
157
continue;
158
}
159
if (try_scan(&scan_start, "verboseExtensions")) {
160
extensions->verboseExtensions = true;
161
continue;
162
}
163
if(try_scan(&scan_start, "enableNonDeterministicSweep")) {
164
extensions->nonDeterministicSweep = true;
165
continue;
166
}
167
if(try_scan(&scan_start, "disableNonDeterministicSweep")) {
168
extensions->nonDeterministicSweep = false;
169
continue;
170
}
171
if(try_scan(&scan_start, "fixHeapForWalk")) {
172
extensions->fixHeapForWalk = true;
173
continue;
174
}
175
if (try_scan(&scan_start, "overflowCacheCount=")) {
176
if(!scan_udata_helper(vm, &scan_start, &(extensions->overflowCacheCount), "overflowCacheCount=")) {
177
returnValue = JNI_EINVAL;
178
break;
179
}
180
continue;
181
}
182
if (try_scan(&scan_start, "allocationTrackerMaxTotalError=")) {
183
if(!scan_udata_memory_size_helper(vm, &scan_start, &extensions->allocationTrackerMaxTotalError, "allocationTrackerMaxTotalError=")) {
184
extensions->allocationTrackerFlushThreshold = OMR_MIN(extensions->allocationTrackerMaxThreshold, extensions->allocationTrackerMaxTotalError);
185
returnValue = JNI_EINVAL;
186
break;
187
}
188
continue;
189
}
190
if (try_scan(&scan_start, "allocationTrackerMaxThreshold=")) {
191
if(!scan_udata_memory_size_helper(vm, &scan_start, &extensions->allocationTrackerMaxThreshold, "allocationTrackerMaxThreshold=")) {
192
extensions->allocationTrackerFlushThreshold = OMR_MIN(extensions->allocationTrackerMaxThreshold, extensions->allocationTrackerMaxTotalError);
193
returnValue = JNI_EINVAL;
194
break;
195
}
196
continue;
197
}
198
if(try_scan(&scan_start, "noConcurrentSweep")) {
199
extensions->concurrentSweepingEnabled = false;
200
continue;
201
}
202
if(try_scan(&scan_start, "noConcurrentTrace")) {
203
extensions->concurrentTracingEnabled = false;
204
continue;
205
}
206
if(try_scan(&scan_start, "concurrentSweep")) {
207
extensions->concurrentSweepingEnabled = true;
208
continue;
209
}
210
if(try_scan(&scan_start, "concurrentTrace")) {
211
extensions->concurrentTracingEnabled = true;
212
continue;
213
}
214
215
if (try_scan(&scan_start, "allocationContextCount=")) {
216
if(!scan_udata_helper(vm, &scan_start, &(extensions->managedAllocationContextCount), "allocationContextCount=")) {
217
returnValue = JNI_EINVAL;
218
break;
219
}
220
221
if (extensions->managedAllocationContextCount <= 0) {
222
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "allocationContextCount=", (UDATA)0);
223
returnValue = JNI_EINVAL;
224
break;
225
}
226
227
continue;
228
}
229
#endif /* J9VM_GC_REALTIME */
230
231
#if defined(J9VM_INTERP_NATIVE_SUPPORT)
232
/* see if we should be using the hot field optimization for the scavenger (this is the default) */
233
if (try_scan(&scan_start, "scvHotAlignment")) {
234
extensions->scavengerAlignHotFields = true;
235
continue;
236
}
237
238
/* see if we should disable the hot field optimization in the scavenger */
239
if (try_scan(&scan_start, "scvNoHotAlignment")) {
240
extensions->scavengerAlignHotFields = false;
241
continue;
242
}
243
#endif /* J9VM_INTERP_NATIVE_SUPPORT */
244
245
#if defined (OMR_GC_COMPRESSED_POINTERS)
246
if (extensions->compressObjectReferences()) {
247
/* see if we are to force disable shifting in compressed refs */
248
if (try_scan(&scan_start, "noShiftingCompression")) {
249
extensions->shouldAllowShiftingCompression = false;
250
continue;
251
}
252
253
/* see if we are forcing shifting to a specific value */
254
if (try_scan(&scan_start, "forcedShiftingCompressionAmount=")) {
255
extensions->shouldForceSpecifiedShiftingCompression = true;
256
if(!scan_udata_helper(vm, &scan_start, &(extensions->forcedShiftingCompressionAmount), "forcedShiftingCompressionAmount=")) {
257
returnValue = JNI_EINVAL;
258
break;
259
}
260
261
if (extensions->forcedShiftingCompressionAmount > LOW_MEMORY_HEAP_CEILING_SHIFT) {
262
returnValue = JNI_EINVAL;
263
break;
264
}
265
266
continue;
267
}
268
}
269
#endif /* defined (OMR_GC_COMPRESSED_POINTERS) */
270
271
#if defined (J9VM_GC_VLHGC)
272
/* parse the maximum age a region can have to be included in the nursery set, if specified */
273
if (try_scan(&scan_start, "tarokNurseryMaxAge=")) {
274
if(!scan_udata_memory_size_helper(vm, &scan_start, &(extensions->tarokNurseryMaxAge._valueSpecified), "tarokNurseryMaxAge=")) {
275
returnValue = JNI_EINVAL;
276
break;
277
}
278
extensions->tarokNurseryMaxAge._wasSpecified = true;
279
continue;
280
}
281
282
/* parse the RememberedSet Card List maximum size */
283
if (try_scan(&scan_start, "tarokRememberedSetCardListMaxSize=")) {
284
if(!scan_udata_memory_size_helper(vm, &scan_start, &(extensions->tarokRememberedSetCardListMaxSize), "tarokRememberedSetCardListMaxSize=")) {
285
returnValue = JNI_EINVAL;
286
break;
287
}
288
289
continue;
290
}
291
292
if (try_scan(&scan_start, "tarokRememberedSetCardListSize=")) {
293
if(!scan_udata_memory_size_helper(vm, &scan_start, &(extensions->tarokRememberedSetCardListSize), "tarokRememberedSetCardListSize=")) {
294
returnValue = JNI_EINVAL;
295
break;
296
}
297
298
continue;
299
}
300
301
/* parse the maximum age a region can be incremented to (increments occurring after a PGC) */
302
if (try_scan(&scan_start, "tarokRegionMaxAge=")) {
303
if(!scan_udata_memory_size_helper(vm, &scan_start, &(extensions->tarokRegionMaxAge), "tarokRegionMaxAge=")) {
304
returnValue = JNI_EINVAL;
305
break;
306
}
307
continue;
308
}
309
310
if (try_scan(&scan_start, "tarokKickoffHeadroomRegionRate=")) {
311
if(!scan_u32_helper(vm, &scan_start, &(extensions->tarokKickoffHeadroomRegionRate), "tarokKickoffHeadroomRegionRate=")) {
312
returnValue = JNI_EINVAL;
313
break;
314
}
315
if (50 < extensions->tarokKickoffHeadroomRegionRate) {
316
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "tarokKickoffHeadroomRegionRate=", (UDATA)0, (UDATA)50);
317
returnValue = JNI_EINVAL;
318
break;
319
}
320
continue;
321
}
322
323
if (try_scan(&scan_start, "tarokKickoffHeadroomInBytes=")) {
324
if(!scan_udata_memory_size_helper(vm, &scan_start, &(extensions->tarokKickoffHeadroomInBytes), "tarokKickoffHeadroomInBytes=")) {
325
returnValue = JNI_EINVAL;
326
break;
327
}
328
extensions->tarokForceKickoffHeadroomInBytes = true;
329
continue;
330
}
331
332
/* see if we are being asked to enable our debugging capabilities (free region poisoning, etc) */
333
if (try_scan(&scan_start, "tarokDebugEnabled")) {
334
extensions->tarokDebugEnabled = true;
335
continue;
336
}
337
if (try_scan(&scan_start, "tarokDisableScoreBasedAtomicCompact")) {
338
extensions->tarokEnableScoreBasedAtomicCompact = false;
339
continue;
340
}
341
if (try_scan(&scan_start, "tarokEnableScoreBasedAtomicCompact")) {
342
extensions->tarokEnableScoreBasedAtomicCompact = true;
343
continue;
344
}
345
if (try_scan(&scan_start, "tarokEnableIncrementalGMP")) {
346
extensions->tarokEnableIncrementalGMP = true;
347
continue;
348
}
349
if (try_scan(&scan_start, "tarokDisableIncrementalGMP")) {
350
extensions->tarokEnableIncrementalGMP = false;
351
continue;
352
}
353
if (try_scan(&scan_start, "tarokEnableExpensiveAssertions")) {
354
extensions->tarokEnableExpensiveAssertions = true;
355
continue;
356
}
357
if (try_scan(&scan_start, "tarokDisableExpensiveAssertions")) {
358
extensions->tarokEnableExpensiveAssertions = false;
359
continue;
360
}
361
if (try_scan(&scan_start, "tarokTgcEnableRememberedSetDuplicateDetection")) {
362
extensions->tarokTgcEnableRememberedSetDuplicateDetection = true;
363
continue;
364
}
365
if (try_scan(&scan_start, "tarokTgcDisableRememberedSetDuplicateDetection")) {
366
extensions->tarokTgcEnableRememberedSetDuplicateDetection = false;
367
continue;
368
}
369
if (try_scan(&scan_start, "tarokPGCOnlyCopyForward")) {
370
extensions->tarokPGCShouldMarkCompact = false;
371
continue;
372
}
373
if (try_scan(&scan_start, "tarokPGCOnlyMarkCompact")) {
374
extensions->tarokPGCShouldCopyForward = false;
375
continue;
376
}
377
if (try_scan(&scan_start, "tarokEnableDynamicCollectionSetSelection")) {
378
extensions->tarokEnableDynamicCollectionSetSelection = true;
379
continue;
380
}
381
if (try_scan(&scan_start, "tarokDisableDynamicCollectionSetSelection")) {
382
extensions->tarokEnableDynamicCollectionSetSelection = false;
383
continue;
384
}
385
if (try_scan(&scan_start, "tarokDynamicCollectionSetSelectionAbsoluteBudget=")) {
386
if(!scan_udata_helper(vm, &scan_start, &extensions->tarokDynamicCollectionSetSelectionAbsoluteBudget, "tarokDynamicCollectionSetSelectionAbsoluteBudget=")) {
387
returnValue = JNI_EINVAL;
388
break;
389
}
390
extensions->tarokDynamicCollectionSetSelectionPercentageBudget = 0.0;
391
continue ;
392
}
393
if (try_scan(&scan_start, "tarokDynamicCollectionSetSelectionPercentageBudget=")) {
394
UDATA percentage = 0;
395
if(!scan_udata_helper(vm, &scan_start, &percentage, "tarokDynamicCollectionSetSelectionPercentageBudget=")) {
396
returnValue = JNI_EINVAL;
397
break;
398
}
399
if(percentage > 100) {
400
returnValue = JNI_EINVAL;
401
break;
402
}
403
extensions->tarokDynamicCollectionSetSelectionPercentageBudget = ((double)percentage) / 100.0;
404
extensions->tarokDynamicCollectionSetSelectionAbsoluteBudget = 0;
405
continue ;
406
}
407
if (try_scan(&scan_start, "tarokCoreSamplingAbsoluteBudget=")) {
408
if(!scan_udata_helper(vm, &scan_start, &extensions->tarokCoreSamplingAbsoluteBudget, "tarokCoreSamplingAbsoluteBudget=")) {
409
returnValue = JNI_EINVAL;
410
break;
411
}
412
extensions->tarokCoreSamplingPercentageBudget = 0.0;
413
continue ;
414
}
415
if (try_scan(&scan_start, "tarokCoreSamplingPercentageBudget=")) {
416
UDATA percentage = 0;
417
if(!scan_udata_helper(vm, &scan_start, &percentage, "tarokCoreSamplingPercentageBudget=")) {
418
returnValue = JNI_EINVAL;
419
break;
420
}
421
if(percentage > 100) {
422
returnValue = JNI_EINVAL;
423
break;
424
}
425
extensions->tarokCoreSamplingPercentageBudget = ((double)percentage) / 100.0;
426
extensions->tarokCoreSamplingAbsoluteBudget = 0;
427
continue ;
428
}
429
430
if (try_scan(&scan_start, "tarokGlobalMarkIncrementTimeMillis=")) {
431
if(!scan_udata_helper(vm, &scan_start, &extensions->tarokGlobalMarkIncrementTimeMillis, "tarokGlobalMarkIncrementTimeMillis=")) {
432
returnValue = JNI_EINVAL;
433
break;
434
}
435
continue;
436
}
437
if (try_scan(&scan_start, "tarokPGCtoGMP=")) {
438
if(!scan_udata_helper(vm, &scan_start, &extensions->tarokPGCtoGMPNumerator, "tarokPGCtoGMP=")) {
439
returnValue = JNI_EINVAL;
440
break;
441
}
442
if (try_scan(&scan_start, ":")) {
443
if(!scan_udata_helper(vm, &scan_start, &extensions->tarokPGCtoGMPDenominator, "tarokPGCtoGMP=")) {
444
returnValue = JNI_EINVAL;
445
break;
446
}
447
}
448
if ( (1 != extensions->tarokPGCtoGMPNumerator) && (1 != extensions->tarokPGCtoGMPDenominator) ) {
449
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTION_MALFORMED, "tarokPGCtoGMP=");
450
returnValue = JNI_EINVAL;
451
break;
452
}
453
454
continue;
455
}
456
if (try_scan(&scan_start, "tarokGMPIntermission=")) {
457
if (try_scan(&scan_start, "auto")) {
458
extensions->tarokAutomaticGMPIntermission = true;
459
extensions->tarokGMPIntermission = UDATA_MAX;
460
} else if(scan_udata_helper(vm, &scan_start, &extensions->tarokGMPIntermission, "tarokGMPIntermission=")) {
461
extensions->tarokAutomaticGMPIntermission = false;
462
} else {
463
returnValue = JNI_EINVAL;
464
break;
465
}
466
continue;
467
}
468
if (try_scan(&scan_start, "tarokNoCommonThreads")) {
469
extensions->tarokAttachedThreadsAreCommon = false;
470
continue;
471
}
472
if (try_scan(&scan_start, "tarokCopyForwardFragmentationTarget=")) {
473
UDATA percentage = 0;
474
if(!scan_udata_helper(vm, &scan_start, &percentage, "tarokCopyForwardFragmentationTarget=")) {
475
returnValue = JNI_EINVAL;
476
break;
477
}
478
extensions->tarokCopyForwardFragmentationTarget = ((double)percentage) / 100.0;
479
continue ;
480
}
481
if (try_scan(&scan_start, "tarokDefragmentEmptinessThreshold=")) {
482
UDATA percentage = 0;
483
if (try_scan(&scan_start, "auto")) {
484
extensions->tarokAutomaticDefragmentEmptinessThreshold = true;
485
extensions->tarokDefragmentEmptinessThreshold = 0.0;
486
} else if (scan_udata_helper(vm, &scan_start, &percentage, "tarokDefragmentEmptinessThreshold=")) {
487
if (percentage > 100) {
488
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "-XXgc:tarokDefragmentEmptinessThreshold=", (UDATA)0, (UDATA)100);
489
returnValue = JNI_EINVAL;
490
break;
491
}
492
extensions->tarokAutomaticDefragmentEmptinessThreshold = false;
493
extensions->tarokDefragmentEmptinessThreshold = ((double)percentage) / 100.0;
494
} else {
495
returnValue = JNI_EINVAL;
496
break;
497
}
498
499
continue ;
500
}
501
if (try_scan(&scan_start, "tarokConcurrentMarkingCostWeight=")) {
502
UDATA percentage = 0;
503
if (!scan_udata_helper(vm, &scan_start, &percentage, "tarokConcurrentMarkingCostWeight=")) {
504
returnValue = JNI_EINVAL;
505
break;
506
}
507
if (percentage > 100) {
508
returnValue = JNI_EINVAL;
509
break;
510
}
511
extensions->tarokConcurrentMarkingCostWeight = ((double)percentage) / 100.0;
512
continue ;
513
}
514
if (try_scan(&scan_start, "tarokEnableCardScrubbing")) {
515
extensions->tarokEnableCardScrubbing = true;
516
continue;
517
}
518
if (try_scan(&scan_start, "tarokDisableCardScrubbing")) {
519
extensions->tarokEnableCardScrubbing = false;
520
continue;
521
}
522
if (try_scan(&scan_start, "tarokEnableConcurrentGMP")) {
523
extensions->tarokEnableConcurrentGMP = true;
524
continue;
525
}
526
if (try_scan(&scan_start, "tarokDisableConcurrentGMP")) {
527
extensions->tarokEnableConcurrentGMP = false;
528
continue;
529
}
530
if (try_scan(&scan_start, "tarokEnableIncrementalClassGC")) {
531
extensions->tarokEnableIncrementalClassGC = true;
532
continue;
533
}
534
if (try_scan(&scan_start, "tarokDisableIncrementalClassGC")) {
535
extensions->tarokEnableIncrementalClassGC = false;
536
continue;
537
}
538
if (try_scan(&scan_start, "tarokEnableCompressedCardTable")) {
539
extensions->tarokEnableCompressedCardTable = true;
540
continue;
541
}
542
if (try_scan(&scan_start, "tarokDisableCompressedCardTable")) {
543
extensions->tarokEnableCompressedCardTable = false;
544
continue;
545
}
546
if (try_scan(&scan_start, "tarokEnableLeafFirstCopying")) {
547
extensions->tarokEnableLeafFirstCopying = true;
548
continue;
549
}
550
if (try_scan(&scan_start, "tarokDisableLeafFirstCopying")) {
551
extensions->tarokEnableLeafFirstCopying = false;
552
continue;
553
}
554
if (try_scan(&scan_start, "tarokEnableStableRegionDetection")) {
555
extensions->tarokEnableStableRegionDetection = true;
556
continue;
557
}
558
if (try_scan(&scan_start, "tarokDisableStableRegionDetection")) {
559
extensions->tarokEnableStableRegionDetection = false;
560
continue;
561
}
562
if (try_scan(&scan_start, "tarokAllocationAgeEnabled")) {
563
extensions->tarokAllocationAgeEnabled = true;
564
continue;
565
}
566
if (try_scan(&scan_start, "tarokAllocationAgeDisabled")) {
567
extensions->tarokAllocationAgeEnabled = false;
568
continue;
569
}
570
if (try_scan(&scan_start, "tarokAllocationAgeExponentBase=")) {
571
UDATA exponentBase = 0;
572
if(!scan_udata_helper(vm, &scan_start, &exponentBase, "tarokAllocationAgeExponentBase=")) {
573
returnValue = JNI_EINVAL;
574
break;
575
}
576
extensions->tarokAllocationAgeExponentBase = ((double)exponentBase) / 100.0;
577
continue ;
578
}
579
if (try_scan(&scan_start, "tarokAllocationAgeUnit=")) {
580
if(!scan_udata_memory_size_helper(vm, &scan_start, &(extensions->tarokAllocationAgeUnit), "tarokAllocationAgeUnit=")) {
581
returnValue = JNI_EINVAL;
582
break;
583
}
584
continue;
585
}
586
if (try_scan(&scan_start, "tarokMaximumAgeInBytes=")) {
587
if(!scan_u64_memory_size_helper(vm, &scan_start, &(extensions->tarokMaximumAgeInBytes), "tarokMaximumAgeInBytes=")) {
588
returnValue = JNI_EINVAL;
589
break;
590
}
591
continue;
592
}
593
if (try_scan(&scan_start, "tarokMaximumNurseryAgeInBytes=")) {
594
if(!scan_u64_memory_size_helper(vm, &scan_start, &(extensions->tarokMaximumNurseryAgeInBytes), "tarokMaximumNurseryAgeInBytes=")) {
595
returnValue = JNI_EINVAL;
596
break;
597
}
598
continue;
599
}
600
if (try_scan(&scan_start, "tarokEnableProjectedSurvivalCollectionSet")) {
601
extensions->tarokUseProjectedSurvivalCollectionSet = true;
602
continue;
603
}
604
if (try_scan(&scan_start, "tarokDisableProjectedSurvivalCollectionSet")) {
605
extensions->tarokUseProjectedSurvivalCollectionSet = false;
606
continue;
607
}
608
if (try_scan(&scan_start, "tarokWorkSplittingPeriod=")) {
609
if(!scan_hex_helper(vm, &scan_start, &(extensions->tarokWorkSplittingPeriod), "tarokWorkSplittingPeriod=")) {
610
returnValue = JNI_EINVAL;
611
break;
612
}
613
continue;
614
}
615
if (try_scan(&scan_start, "tarokMinimumGMPWorkTargetBytes=")) {
616
UDATA workTarget = 0;
617
if(!scan_udata_memory_size_helper(vm, &scan_start, &workTarget, "tarokMinimumGMPWorkTargetBytes=")) {
618
returnValue = JNI_EINVAL;
619
break;
620
}
621
if(0 == workTarget) {
622
j9nls_printf(PORTLIB,J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "-XXgc:tarokMinimumGMPWorkTargetBytes", (UDATA)0);
623
returnValue = JNI_EINVAL;
624
break;
625
}
626
627
extensions->tarokMinimumGMPWorkTargetBytes._wasSpecified = true;
628
extensions->tarokMinimumGMPWorkTargetBytes._valueSpecified = workTarget;
629
630
continue;
631
}
632
#endif /* defined (J9VM_GC_VLHGC) */
633
634
if(try_scan(&scan_start, "packetListLockSplit=")) {
635
if(!scan_udata_helper(vm, &scan_start, &extensions->packetListSplit, "packetListLockSplit=")) {
636
returnValue = JNI_EINVAL;
637
break;
638
}
639
if(0 == extensions->packetListSplit) {
640
j9nls_printf(PORTLIB,J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "-XXgc:packetListLockSplit", (UDATA)0);
641
returnValue = JNI_EINVAL;
642
break;
643
}
644
continue;
645
}
646
647
#if defined(J9VM_GC_MODRON_SCAVENGER)
648
if(try_scan(&scan_start, "cacheListLockSplit=")) {
649
if(!scan_udata_helper(vm, &scan_start, &extensions->cacheListSplit, "cacheListLockSplit=")) {
650
returnValue = JNI_EINVAL;
651
break;
652
}
653
if(0 == extensions->cacheListSplit) {
654
j9nls_printf(PORTLIB,J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "-XXgc:cacheListLockSplit", (UDATA)0);
655
returnValue = JNI_EINVAL;
656
break;
657
}
658
continue;
659
}
660
#endif /* J9VM_GC_MODRON_SCAVENGER */
661
662
if (try_scan(&scan_start, "markingArraySplitMinimumAmount=")) {
663
UDATA arraySplitAmount = 0;
664
if(!scan_udata_helper(vm, &scan_start, &arraySplitAmount, "markingArraySplitMinimumAmount=")) {
665
returnValue = JNI_EINVAL;
666
break;
667
}
668
extensions->markingArraySplitMinimumAmount = (0 == arraySplitAmount) ? UDATA_MAX : arraySplitAmount;
669
continue;
670
}
671
if (try_scan(&scan_start, "markingArraySplitMaximumAmount=")) {
672
UDATA arraySplitAmount = 0;
673
if(!scan_udata_helper(vm, &scan_start, &arraySplitAmount, "markingArraySplitMaximumAmount=")) {
674
returnValue = JNI_EINVAL;
675
break;
676
}
677
extensions->markingArraySplitMaximumAmount = (0 == arraySplitAmount) ? UDATA_MAX : arraySplitAmount;
678
679
if(extensions->markingArraySplitMaximumAmount < extensions->markingArraySplitMinimumAmount) {
680
j9nls_printf(PORTLIB,J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "-XXgc:markingArraySplitMaximumAmount", (UDATA)extensions->markingArraySplitMinimumAmount);
681
returnValue = JNI_EINVAL;
682
break;
683
}
684
685
continue;
686
}
687
688
if (try_scan(&scan_start, "stdSplitFreeListSplitAmount=h")) {
689
j9tty_printf(PORTLIB, "stdSplitFreeListSplitAmount=h %s\n", scan_start);
690
691
if(!scan_udata_helper(vm, &scan_start, &extensions->splitFreeListSplitAmount, "stdSplitFreeListSplitAmount=h")) {
692
returnValue = JNI_EINVAL;
693
break;
694
}
695
if(1 >= extensions->splitFreeListSplitAmount) {
696
j9nls_printf(PORTLIB,J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "-XXgc:stdSplitFreeListSplitAmount=h", (UDATA)1);
697
returnValue = JNI_EINVAL;
698
break;
699
}
700
extensions->enableHybridMemoryPool = true;
701
continue;
702
}
703
704
if (try_scan(&scan_start, "stdSplitFreeListSplitAmount=")) {
705
j9tty_printf(PORTLIB, "stdSplitFreeListSplitAmount= %s\n", scan_start);
706
if(!scan_udata_helper(vm, &scan_start, &extensions->splitFreeListSplitAmount, "stdSplitFreeListSplitAmount=")) {
707
returnValue = JNI_EINVAL;
708
break;
709
}
710
if(0 == extensions->splitFreeListSplitAmount) {
711
j9nls_printf(PORTLIB,J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "-XXgc:stdSplitFreeListSplitAmount", (UDATA)0);
712
returnValue = JNI_EINVAL;
713
break;
714
}
715
continue;
716
}
717
718
/* Start of options relating to dynamicBreadthFirstScanOrdering */
719
#if defined(J9VM_GC_MODRON_SCAVENGER) || defined (J9VM_GC_VLHGC)
720
if(try_scan(&scan_start, "dbfGcCountBetweenHotFieldSort=")) {
721
UDATA value;
722
if(!scan_udata_helper(vm, &scan_start, &value, "dbfGcCountBetweenHotFieldSort=")) {
723
returnValue = JNI_EINVAL;
724
break;
725
}
726
if(value > 10) {
727
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "dbfGcCountBetweenHotFieldSort=", (UDATA)0, (UDATA)10);
728
returnValue = JNI_EINVAL;
729
break;
730
}
731
extensions->gcCountBetweenHotFieldSort = value;
732
continue;
733
}
734
735
if(try_scan(&scan_start, "dbfGcCountBetweenHotFieldSortMax=")) {
736
UDATA value;
737
if(!scan_udata_helper(vm, &scan_start, &value, "dbfGcCountBetweenHotFieldSortMax=")) {
738
returnValue = JNI_EINVAL;
739
break;
740
}
741
if(value > 50) {
742
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "dbfGcCountBetweenHotFieldSortMax=", (UDATA)0, (UDATA)50);
743
returnValue = JNI_EINVAL;
744
break;
745
}
746
extensions->gcCountBetweenHotFieldSortMax = value;
747
continue;
748
}
749
750
if(try_scan(&scan_start, "dbfDisableAdaptiveGcCountBetweenHotFieldSort")) {
751
extensions->adaptiveGcCountBetweenHotFieldSort = false;
752
continue;
753
}
754
755
if(try_scan(&scan_start, "dbfDisableDepthCopyTwoPaths")) {
756
extensions->depthCopyTwoPaths = false;
757
continue;
758
}
759
760
if(try_scan(&scan_start, "dbfDepthCopyThreePaths")) {
761
extensions->depthCopyThreePaths = true;
762
continue;
763
}
764
765
if(try_scan(&scan_start, "dbfEnableAlwaysDepthCopyFirstOffset")) {
766
extensions->alwaysDepthCopyFirstOffset = true;
767
continue;
768
}
769
770
if(try_scan(&scan_start, "dbfEnablePermanantHotFields")) {
771
extensions->allowPermanantHotFields = true;
772
continue;
773
}
774
775
if(try_scan(&scan_start, "dbfMaxConsecutiveHotFieldSelections=")) {
776
UDATA value;
777
if(!scan_udata_helper(vm, &scan_start, &value, "dbfMaxConsecutiveHotFieldSelections=")) {
778
returnValue = JNI_EINVAL;
779
break;
780
}
781
if(value > 50) {
782
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "dbfMaxConsecutiveHotFieldSelections=", (UDATA)0, (UDATA)50);
783
returnValue = JNI_EINVAL;
784
break;
785
}
786
extensions->maxConsecutiveHotFieldSelections = value;
787
continue;
788
}
789
790
if(try_scan(&scan_start, "dbfEnableHotFieldResetting")) {
791
extensions->hotFieldResettingEnabled = true;
792
continue;
793
}
794
795
if(try_scan(&scan_start, "dbfGcCountBetweenHotFieldReset=")) {
796
UDATA value;
797
if(!scan_udata_helper(vm, &scan_start, &value, "dbfGcCountBetweenHotFieldReset=")) {
798
returnValue = JNI_EINVAL;
799
break;
800
}
801
if(value > 5000) {
802
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "dbfGcCountBetweenHotFieldReset=", (UDATA)0, (UDATA)5000);
803
returnValue = JNI_EINVAL;
804
break;
805
}
806
extensions->gcCountBetweenHotFieldReset = value;
807
continue;
808
}
809
810
if(try_scan(&scan_start, "dbfDepthCopyMax=")) {
811
UDATA value;
812
if(!scan_udata_helper(vm, &scan_start, &value, "dbfDepthCopyMax=")) {
813
returnValue = JNI_EINVAL;
814
break;
815
}
816
if(value > 10) {
817
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "dbfDepthCopyMax=", (UDATA)0, (UDATA)10);
818
returnValue = JNI_EINVAL;
819
break;
820
}
821
extensions->depthCopyMax = value;
822
continue;
823
}
824
825
if(try_scan(&scan_start, "dbfMaxHotFieldListLength=")) {
826
UDATA value;
827
if(!scan_udata_helper(vm, &scan_start, &value, "dbfMaxHotFieldListLength=")) {
828
returnValue = JNI_EINVAL;
829
break;
830
}
831
if(value > 20) {
832
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "dbfMaxHotFieldListLength=", (UDATA)0, (UDATA)20);
833
returnValue = JNI_EINVAL;
834
break;
835
}
836
extensions->maxHotFieldListLength = ((uint32_t)value);
837
continue;
838
}
839
840
if(try_scan(&scan_start, "dbfMinCpuUtil=")) {
841
UDATA value;
842
if(!scan_udata_helper(vm, &scan_start, &value, "dbfMinCpuUtil=")) {
843
returnValue = JNI_EINVAL;
844
break;
845
}
846
if(value > 15) {
847
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "dbfMinCpuUtil=", (UDATA)0, (UDATA)15);
848
returnValue = JNI_EINVAL;
849
break;
850
}
851
extensions->minCpuUtil = value;
852
continue;
853
}
854
#endif /* defined(J9VM_GC_MODRON_SCAVENGER) || defined (J9VM_GC_VLHGC) */
855
/* End of options relating to dynamicBreadthFirstScanOrdering */
856
857
#if defined(J9VM_GC_MODRON_SCAVENGER)
858
if (try_scan(&scan_start, "scanCacheMinimumSize=")) {
859
/* Read in restricted scan cache size */
860
if(!scan_udata_helper(vm, &scan_start, &extensions->scavengerScanCacheMinimumSize, "scanCacheMinimumSize=")) {
861
returnValue = JNI_EINVAL;
862
break;
863
}
864
if(0 == extensions->scavengerScanCacheMinimumSize) {
865
j9nls_printf(PORTLIB,J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "-XXgc:scanCacheMinimumSize", (UDATA)0);
866
returnValue = JNI_EINVAL;
867
break;
868
}
869
continue;
870
}
871
872
if (try_scan(&scan_start, "scanCacheMaximumSize=")) {
873
/* Read in restricted scan cache size */
874
if(!scan_udata_helper(vm, &scan_start, &extensions->scavengerScanCacheMaximumSize, "scanCacheMaximumSize=")) {
875
returnValue = JNI_EINVAL;
876
break;
877
}
878
if(extensions->scavengerScanCacheMinimumSize > extensions->scavengerScanCacheMaximumSize) {
879
j9nls_printf(PORTLIB,J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "-XXgc:scanCacheMaximumSize", (UDATA)extensions->scavengerScanCacheMinimumSize);
880
returnValue = JNI_EINVAL;
881
break;
882
}
883
continue;
884
}
885
886
if (try_scan(&scan_start, "scvArraySplitAmount=")) {
887
UDATA arraySplitAmount = 0;
888
if(!scan_udata_helper(vm, &scan_start, &arraySplitAmount, "scvArraySplitAmount=")) {
889
returnValue = JNI_EINVAL;
890
break;
891
}
892
extensions->scvArraySplitMinimumAmount = (0 == arraySplitAmount) ? UDATA_MAX : arraySplitAmount;
893
extensions->scvArraySplitMaximumAmount = extensions->scvArraySplitMinimumAmount;
894
continue;
895
}
896
if (try_scan(&scan_start, "scvArraySplitMinimumAmount=")) {
897
UDATA arraySplitAmount = 0;
898
if(!scan_udata_helper(vm, &scan_start, &arraySplitAmount, "scvArraySplitMinimumAmount=")) {
899
returnValue = JNI_EINVAL;
900
break;
901
}
902
extensions->scvArraySplitMinimumAmount = (0 == arraySplitAmount) ? UDATA_MAX : arraySplitAmount;
903
continue;
904
}
905
if (try_scan(&scan_start, "scvArraySplitMaximumAmount=")) {
906
UDATA arraySplitAmount = 0;
907
if(!scan_udata_helper(vm, &scan_start, &arraySplitAmount, "scvArraySplitMaximumAmount=")) {
908
returnValue = JNI_EINVAL;
909
break;
910
}
911
extensions->scvArraySplitMaximumAmount = (0 == arraySplitAmount) ? UDATA_MAX : arraySplitAmount;
912
913
if(extensions->scvArraySplitMaximumAmount < extensions->scvArraySplitMinimumAmount) {
914
j9nls_printf(PORTLIB,J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "-XXgc:scvArraySplitMaximumAmount", (UDATA)extensions->scvArraySplitMinimumAmount);
915
returnValue = JNI_EINVAL;
916
break;
917
}
918
919
continue;
920
}
921
if (try_scan(&scan_start, "aliasInhibitingThresholdPercentage=")) {
922
UDATA percentage = 0;
923
if(!scan_udata_helper(vm, &scan_start, &percentage, "aliasInhibitingThresholdPercentage=")) {
924
returnValue = JNI_EINVAL;
925
break;
926
}
927
if(percentage > 100) {
928
returnValue = JNI_EINVAL;
929
break;
930
}
931
extensions->aliasInhibitingThresholdPercentage = ((double)percentage) / 100.0;
932
933
continue;
934
}
935
936
if (try_scan(&scan_start, "adaptiveThreadingSensitivityFactor=")) {
937
UDATA sensitivityFactor = 0;
938
if (!scan_udata_helper(vm, &scan_start, &sensitivityFactor, "adaptiveThreadingSensitivityFactor=")) {
939
returnValue = JNI_EINVAL;
940
break;
941
}
942
extensions->adaptiveThreadingSensitivityFactor = ((float)sensitivityFactor) / 10.0f;
943
944
continue;
945
}
946
947
if (try_scan(&scan_start, "adaptiveThreadingWeightActiveThreads=")) {
948
UDATA adaptiveThreadingWeightActiveThreads = 0;
949
if (!scan_udata_helper(vm, &scan_start, &adaptiveThreadingWeightActiveThreads, "adaptiveThreadingWeightActiveThreads=")) {
950
returnValue = JNI_EINVAL;
951
break;
952
}
953
954
extensions->adaptiveThreadingWeightActiveThreads = ((float)adaptiveThreadingWeightActiveThreads) / 100.0f;
955
956
continue;
957
}
958
959
if (try_scan(&scan_start, "adaptiveThreadBooster=")) {
960
UDATA adaptiveThreadBooster = 0;
961
if (!scan_udata_helper(vm, &scan_start, &adaptiveThreadBooster, "adaptiveThreadBooster=")) {
962
returnValue = JNI_EINVAL;
963
break;
964
}
965
extensions->adaptiveThreadBooster = ((float)adaptiveThreadBooster) / 100.0f;
966
967
continue;
968
}
969
970
#if defined(OMR_GC_CONCURRENT_SCAVENGER)
971
if (try_scan(&scan_start, "debugConcurrentScavengerPageAlignment")) {
972
extensions->setDebugConcurrentScavengerPageAlignment(true);
973
continue;
974
}
975
if(try_scan(&scan_start, "softwareRangeCheckReadBarrier")) {
976
extensions->softwareRangeCheckReadBarrier = true;
977
continue;
978
}
979
980
if (try_scan(&scan_start, "enableConcurrentScavengeExhaustiveTermination")) {
981
extensions->concurrentScavengeExhaustiveTermination = true;
982
continue;
983
}
984
985
if (try_scan(&scan_start, "disableConcurrentScavengeExhaustiveTermination")) {
986
extensions->concurrentScavengeExhaustiveTermination = false;
987
continue;
988
}
989
#endif /* defined(OMR_GC_CONCURRENT_SCAVENGER) */
990
991
#endif /* defined(J9VM_GC_MODRON_SCAVENGER) */
992
993
if (try_scan(&scan_start, "enableFrequentObjectAllocationSampling")) {
994
extensions->doFrequentObjectAllocationSampling = true;
995
continue;
996
}
997
998
if (try_scan(&scan_start, "disableFrequentObjectAllocationSampling")) {
999
extensions->doFrequentObjectAllocationSampling = false;
1000
continue;
1001
}
1002
1003
if (try_scan(&scan_start, "frequentObjectAllocationSamplingDepth=")) {
1004
if (!scan_u32_helper(vm, &scan_start, &extensions->frequentObjectAllocationSamplingDepth, "frequentObjectAllocationSamplingDepth=")) {
1005
returnValue = JNI_EINVAL;
1006
break;
1007
}
1008
if (0 == extensions->frequentObjectAllocationSamplingDepth) {
1009
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_VALUE_MUST_BE_ABOVE, "-XXgc:frequentObjectAllocationSamplingDepth", (UDATA)0);
1010
returnValue = JNI_EINVAL;
1011
break;
1012
}
1013
1014
extensions->doFrequentObjectAllocationSampling = true;
1015
continue;
1016
}
1017
1018
if (try_scan(&scan_start, "frequentObjectAllocationSamplingRate=")) {
1019
UDATA percentage = 0;
1020
if (!scan_udata_helper(vm, &scan_start, &percentage, "frequentObjectAllocationSamplingRate=")) {
1021
returnValue = JNI_EINVAL;
1022
break;
1023
}
1024
if (percentage > 100) {
1025
returnValue = JNI_EINVAL;
1026
break;
1027
}
1028
1029
extensions->frequentObjectAllocationSamplingRate = percentage;
1030
extensions->doFrequentObjectAllocationSampling = true;
1031
continue;
1032
}
1033
1034
if (try_scan(&scan_start, "largeObjectAllocationProfilingThreshold=")) {
1035
if (!scan_udata_helper(vm, &scan_start, &extensions->largeObjectAllocationProfilingThreshold, "largeObjectAllocationProfilingThreshold=")) {
1036
returnValue = JNI_EINVAL;
1037
break;
1038
}
1039
continue;
1040
}
1041
1042
if (try_scan(&scan_start, "largeObjectAllocationProfilingVeryLargeObjectThreshold=")) {
1043
if (!scan_udata_helper(vm, &scan_start, &extensions->largeObjectAllocationProfilingVeryLargeObjectThreshold, "largeObjectAllocationProfilingVeryLargeObjectThreshold=")) {
1044
returnValue = JNI_EINVAL;
1045
break;
1046
}
1047
continue;
1048
}
1049
1050
if (try_scan(&scan_start, "largeObjectAllocationProfilingTopK=")) {
1051
if (!scan_u32_helper(vm, &scan_start, &extensions->largeObjectAllocationProfilingTopK, "largeObjectAllocationProfilingTopK=")) {
1052
returnValue = JNI_EINVAL;
1053
break;
1054
}
1055
1056
if ((extensions->largeObjectAllocationProfilingTopK < 1) || (128 < extensions->largeObjectAllocationProfilingTopK)) {
1057
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "largeObjectAllocationProfilingTopK=", (UDATA)1, (UDATA)128);
1058
returnValue = JNI_EINVAL;
1059
break;
1060
}
1061
1062
continue;
1063
}
1064
1065
if (try_scan(&scan_start, "largeObjectAllocationProfilingSizeClassRatio=")) {
1066
if (!scan_u32_helper(vm, &scan_start, &extensions->largeObjectAllocationProfilingSizeClassRatio, "largeObjectAllocationProfilingSizeClassRatio=")) {
1067
returnValue = JNI_EINVAL;
1068
break;
1069
}
1070
1071
if ((extensions->largeObjectAllocationProfilingSizeClassRatio < 101) || (200 < extensions->largeObjectAllocationProfilingSizeClassRatio)) {
1072
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "largeObjectAllocationProfilingSizeClassRatio=", (UDATA)101, (UDATA)200);
1073
returnValue = JNI_EINVAL;
1074
break;
1075
}
1076
1077
continue;
1078
}
1079
1080
if (try_scan(&scan_start, "enableEstimateFragmentationGlobalGCOnly")) {
1081
extensions->estimateFragmentation = GLOBALGC_ESTIMATE_FRAGMENTATION;
1082
extensions->processLargeAllocateStats = true;
1083
continue;
1084
}
1085
1086
if (try_scan(&scan_start, "enableEstimateFragmentation")) {
1087
extensions->estimateFragmentation = (GLOBALGC_ESTIMATE_FRAGMENTATION | LOCALGC_ESTIMATE_FRAGMENTATION);
1088
extensions->processLargeAllocateStats = true;
1089
continue;
1090
}
1091
1092
if (try_scan(&scan_start, "disableEstimateFragmentation")) {
1093
extensions->estimateFragmentation = NO_ESTIMATE_FRAGMENTATION;
1094
extensions->darkMatterSampleRate = 0;
1095
continue;
1096
}
1097
1098
if (try_scan(&scan_start, "enableProcessLargeAllocateStats")) {
1099
extensions->processLargeAllocateStats = true;
1100
continue;
1101
}
1102
1103
if (try_scan(&scan_start, "disableProcessLargeAllocateStats")) {
1104
extensions->processLargeAllocateStats = false;
1105
extensions->estimateFragmentation = NO_ESTIMATE_FRAGMENTATION;
1106
continue;
1107
}
1108
if (try_scan(&scan_start, "verboseNewFormat")) {
1109
extensions->verboseNewFormat = true;
1110
continue;
1111
}
1112
if (try_scan(&scan_start, "verboseOldFormat")) {
1113
extensions->verboseNewFormat = false;
1114
continue;
1115
}
1116
1117
if (try_scan(&scan_start, "heapSizeStartupHintConservativeFactor=")) {
1118
UDATA percentage = 0;
1119
if(!scan_udata_helper(vm, &scan_start, &percentage, "heapSizeStartupHintConservativeFactor=")) {
1120
returnValue = JNI_EINVAL;
1121
break;
1122
}
1123
if(percentage > 100) {
1124
returnValue = JNI_EINVAL;
1125
break;
1126
}
1127
extensions->heapSizeStartupHintConservativeFactor = ((float)percentage) / 100.0f;
1128
continue ;
1129
}
1130
1131
if (try_scan(&scan_start, "heapSizeStartupHintWeightNewValue=")) {
1132
UDATA percentage = 0;
1133
if(!scan_udata_helper(vm, &scan_start, &percentage, "heapSizeStartupHintWeightNewValue=")) {
1134
returnValue = JNI_EINVAL;
1135
break;
1136
}
1137
if(percentage > 100) {
1138
returnValue = JNI_EINVAL;
1139
break;
1140
}
1141
extensions->heapSizeStartupHintWeightNewValue = ((float)percentage) / 100.0f;
1142
continue ;
1143
}
1144
1145
if (try_scan(&scan_start, "darkMatterCompactThreshold=")) {
1146
UDATA percentage = 0;
1147
if(!scan_udata_helper(vm, &scan_start, &percentage, "darkMatterCompactThreshold=")) {
1148
returnValue = JNI_EINVAL;
1149
break;
1150
}
1151
if(percentage > 100) {
1152
returnValue = JNI_EINVAL;
1153
break;
1154
}
1155
extensions->darkMatterCompactThreshold = ((float)percentage) / 100.0f;
1156
continue;
1157
}
1158
1159
#if defined(OMR_GC_IDLE_HEAP_MANAGER)
1160
if (try_scan(&scan_start, "gcOnIdleCompactThreshold=")) {
1161
UDATA percentage = 0;
1162
if(!scan_udata_helper(vm, &scan_start, &percentage, "gcOnIdleCompactThreshold=")) {
1163
returnValue = JNI_EINVAL;
1164
break;
1165
}
1166
if(percentage > 100) {
1167
returnValue = JNI_EINVAL;
1168
break;
1169
}
1170
extensions->gcOnIdleCompactThreshold = ((float)percentage) / 100.0f;
1171
continue;
1172
}
1173
#endif /* defined(OMR_GC_IDLE_HEAP_MANAGER) */
1174
1175
#if defined (J9VM_GC_VLHGC)
1176
if (try_scan(&scan_start, "fvtest_tarokSimulateNUMA=")) {
1177
UDATA simulatedNodeCount = 0;
1178
if(!scan_udata_memory_size_helper(vm, &scan_start, &simulatedNodeCount, "fvtest_tarokSimulateNUMA=")) {
1179
returnValue = JNI_EINVAL;
1180
break;
1181
}
1182
extensions->_numaManager.setSimulatedNodeCountForFVTest(simulatedNodeCount);
1183
continue;
1184
}
1185
if (try_scan(&scan_start, "fvtest_tarokPGCRotateCollectors")) {
1186
extensions->tarokPGCShouldMarkCompact = true;
1187
extensions->tarokPGCShouldCopyForward = true;
1188
continue;
1189
}
1190
#endif /* defined (J9VM_GC_VLHGC) */
1191
1192
if (try_scan(&scan_start, "fvtest_disableExplictMainThread")) {
1193
extensions->fvtest_disableExplictMainThread = true;
1194
continue;
1195
}
1196
1197
if (try_scan(&scan_start, "fvtest_holdRandomThreadBeforeHandlingWorkUnitPeriod=")) {
1198
if(!scan_udata_helper(vm, &scan_start, &(extensions->_holdRandomThreadBeforeHandlingWorkUnitPeriod), "fvtest_holdRandomThreadBeforeHandlingWorkUnitPeriod=")) {
1199
returnValue = JNI_EINVAL;
1200
break;
1201
}
1202
extensions->_holdRandomThreadBeforeHandlingWorkUnit = true;
1203
continue;
1204
}
1205
1206
if (try_scan(&scan_start, "fvtest_holdRandomThreadBeforeHandlingWorkUnit")) {
1207
extensions->_holdRandomThreadBeforeHandlingWorkUnit = true;
1208
continue;
1209
}
1210
1211
if (try_scan(&scan_start, "fvtest_forceRandomBackoutsAfterScanPeriod=")) {
1212
if(!scan_udata_helper(vm, &scan_start, &(extensions->_forceRandomBackoutsAfterScanPeriod), "fvtest_forceRandomBackoutsAfterScanPeriod=")) {
1213
returnValue = JNI_EINVAL;
1214
break;
1215
}
1216
extensions->_forceRandomBackoutsAfterScan = true;
1217
continue;
1218
}
1219
1220
if (try_scan(&scan_start, "fvtest_forceRandomBackoutsAfterScan")) {
1221
extensions->_forceRandomBackoutsAfterScan = true;
1222
continue;
1223
}
1224
1225
#if defined(OMR_GC_MODRON_CONCURRENT_MARK)
1226
if (try_scan(&scan_start, "fvtest_concurrentCardTablePreparationDelay=")) {
1227
if(!scan_udata_helper(vm, &scan_start, &(extensions->fvtest_concurrentCardTablePreparationDelay), "fvtest_concurrentCardTablePreparationDelay=")) {
1228
returnValue = JNI_EINVAL;
1229
break;
1230
}
1231
continue;
1232
}
1233
1234
if (try_scan(&scan_start, "fvtest_forceConcurrentTLHMarkMapCommitFailure=")) {
1235
if(!scan_udata_helper(vm, &scan_start, &(extensions->fvtest_forceConcurrentTLHMarkMapCommitFailure), "fvtest_forceConcurrentTLHMarkMapCommitFailure=")) {
1236
returnValue = JNI_EINVAL;
1237
break;
1238
}
1239
if (extensions->fvtest_forceConcurrentTLHMarkMapCommitFailure > 0) {
1240
extensions->fvtest_forceConcurrentTLHMarkMapCommitFailureCounter = extensions->fvtest_forceConcurrentTLHMarkMapCommitFailure - 1;
1241
}
1242
continue;
1243
}
1244
1245
if (try_scan(&scan_start, "fvtest_forceConcurrentTLHMarkMapCommitFailure")) {
1246
extensions->fvtest_forceConcurrentTLHMarkMapCommitFailure = 1;
1247
extensions->fvtest_forceConcurrentTLHMarkMapCommitFailureCounter = 0;
1248
continue;
1249
}
1250
1251
if (try_scan(&scan_start, "fvtest_forceConcurrentTLHMarkMapDecommitFailure=")) {
1252
if(!scan_udata_helper(vm, &scan_start, &(extensions->fvtest_forceConcurrentTLHMarkMapDecommitFailure), "fvtest_forceConcurrentTLHMarkMapDecommitFailure=")) {
1253
returnValue = JNI_EINVAL;
1254
break;
1255
}
1256
if (extensions->fvtest_forceConcurrentTLHMarkMapDecommitFailure > 0) {
1257
extensions->fvtest_forceConcurrentTLHMarkMapDecommitFailureCounter = extensions->fvtest_forceConcurrentTLHMarkMapDecommitFailure - 1;
1258
}
1259
continue;
1260
}
1261
1262
if (try_scan(&scan_start, "fvtest_forceConcurrentTLHMarkMapDecommitFailure")) {
1263
extensions->fvtest_forceConcurrentTLHMarkMapDecommitFailure = 1;
1264
extensions->fvtest_forceConcurrentTLHMarkMapDecommitFailureCounter = 0;
1265
continue;
1266
}
1267
1268
#endif /* OMR_GC_MODRON_CONCURRENT_MARK */
1269
1270
#if defined (J9VM_GC_HEAP_CARD_TABLE)
1271
if (try_scan(&scan_start, "fvtest_forceCardTableCommitFailure=")) {
1272
if(!scan_udata_helper(vm, &scan_start, &(extensions->fvtest_forceCardTableCommitFailure), "fvtest_forceCardTableCommitFailure=")) {
1273
returnValue = JNI_EINVAL;
1274
break;
1275
}
1276
if (extensions->fvtest_forceCardTableCommitFailure > 0) {
1277
extensions->fvtest_forceCardTableCommitFailureCounter = extensions->fvtest_forceCardTableCommitFailure - 1;
1278
}
1279
continue;
1280
}
1281
1282
if (try_scan(&scan_start, "fvtest_forceCardTableCommitFailure")) {
1283
extensions->fvtest_forceCardTableCommitFailure = 1;
1284
extensions->fvtest_forceCardTableCommitFailureCounter = 0;
1285
continue;
1286
}
1287
1288
if (try_scan(&scan_start, "fvtest_forceCardTableDecommitFailure=")) {
1289
if(!scan_udata_helper(vm, &scan_start, &(extensions->fvtest_forceCardTableDecommitFailure), "fvtest_forceCardTableDecommitFailure=")) {
1290
returnValue = JNI_EINVAL;
1291
break;
1292
}
1293
if (extensions->fvtest_forceCardTableDecommitFailure > 0) {
1294
extensions->fvtest_forceCardTableDecommitFailureCounter = extensions->fvtest_forceCardTableDecommitFailure - 1;
1295
}
1296
continue;
1297
}
1298
1299
if (try_scan(&scan_start, "fvtest_forceCardTableDecommitFailure")) {
1300
extensions->fvtest_forceCardTableDecommitFailure = 1;
1301
extensions->fvtest_forceCardTableDecommitFailureCounter = 0;
1302
continue;
1303
}
1304
#endif /* J9VM_GC_HEAP_CARD_TABLE */
1305
1306
if (try_scan(&scan_start, "fvtest_forceSweepChunkArrayCommitFailure=")) {
1307
if(!scan_udata_helper(vm, &scan_start, &(extensions->fvtest_forceSweepChunkArrayCommitFailure), "fvtest_forceSweepChunkArrayCommitFailure=")) {
1308
returnValue = JNI_EINVAL;
1309
break;
1310
}
1311
if (extensions->fvtest_forceSweepChunkArrayCommitFailure > 0) {
1312
extensions->fvtest_forceSweepChunkArrayCommitFailureCounter = extensions->fvtest_forceSweepChunkArrayCommitFailure - 1;
1313
}
1314
continue;
1315
}
1316
1317
if (try_scan(&scan_start, "fvtest_forceSweepChunkArrayCommitFailure")) {
1318
extensions->fvtest_forceSweepChunkArrayCommitFailure = 1;
1319
extensions->fvtest_forceSweepChunkArrayCommitFailureCounter = 0;
1320
continue;
1321
}
1322
1323
if (try_scan(&scan_start, "fvtest_forceMarkMapCommitFailure=")) {
1324
if(!scan_udata_helper(vm, &scan_start, &(extensions->fvtest_forceMarkMapCommitFailure), "fvtest_forceMarkMapCommitFailure=")) {
1325
returnValue = JNI_EINVAL;
1326
break;
1327
}
1328
if (extensions->fvtest_forceMarkMapCommitFailure > 0) {
1329
extensions->fvtest_forceMarkMapCommitFailureCounter = extensions->fvtest_forceMarkMapCommitFailure - 1;
1330
}
1331
continue;
1332
}
1333
1334
if (try_scan(&scan_start, "fvtest_forceMarkMapCommitFailure")) {
1335
extensions->fvtest_forceMarkMapCommitFailure = 1;
1336
extensions->fvtest_forceMarkMapCommitFailureCounter = 0;
1337
continue;
1338
}
1339
1340
if (try_scan(&scan_start, "fvtest_forceMarkMapDecommitFailure=")) {
1341
if(!scan_udata_helper(vm, &scan_start, &(extensions->fvtest_forceMarkMapDecommitFailure), "fvtest_forceMarkMapDecommitFailure=")) {
1342
returnValue = JNI_EINVAL;
1343
break;
1344
}
1345
if (extensions->fvtest_forceMarkMapDecommitFailure > 0) {
1346
extensions->fvtest_forceMarkMapDecommitFailureCounter = extensions->fvtest_forceMarkMapDecommitFailure - 1;
1347
}
1348
continue;
1349
}
1350
1351
if (try_scan(&scan_start, "fvtest_forceMarkMapDecommitFailure")) {
1352
extensions->fvtest_forceMarkMapDecommitFailure = 1;
1353
extensions->fvtest_forceMarkMapDecommitFailureCounter = 0;
1354
continue;
1355
}
1356
1357
#if defined(OMR_ENV_DATA64) && defined(OMR_GC_FULL_POINTERS)
1358
if (try_scan(&scan_start, "fvtest_enableReadBarrierVerification=")) {
1359
extensions->fvtest_enableReadBarrierVerification = 0;
1360
1361
char * pattern = scan_to_delim(PORTLIB, &scan_start, ',');
1362
1363
if (true == ('0' != pattern[4])) {
1364
extensions->fvtest_enableHeapReadBarrierVerification = 1;
1365
extensions->fvtest_enableReadBarrierVerification = 1;
1366
}
1367
if (true == ('0' != pattern[3])) {
1368
extensions->fvtest_enableClassStaticsReadBarrierVerification = 1;
1369
extensions->fvtest_enableReadBarrierVerification = 1;
1370
}
1371
if (true == ('0' != pattern[2])){
1372
extensions->fvtest_enableMonitorObjectsReadBarrierVerification = 1;
1373
extensions->fvtest_enableReadBarrierVerification = 1;
1374
}
1375
if (true == ('0' != pattern[1])) {
1376
extensions->fvtest_enableJNIGlobalWeakReadBarrierVerification = 1;
1377
extensions->fvtest_enableReadBarrierVerification = 1;
1378
}
1379
continue;
1380
}
1381
#endif /* defined(OMR_ENV_DATA64) && defined(OMR_GC_FULL_POINTERS) */
1382
1383
if (try_scan(&scan_start, "fvtest_forceReferenceChainWalkerMarkMapCommitFailure=")) {
1384
if(!scan_udata_helper(vm, &scan_start, &(extensions->fvtest_forceReferenceChainWalkerMarkMapCommitFailure), "fvtest_forceReferenceChainWalkerMarkMapCommitFailure=")) {
1385
returnValue = JNI_EINVAL;
1386
break;
1387
}
1388
if (extensions->fvtest_forceReferenceChainWalkerMarkMapCommitFailure > 0) {
1389
extensions->fvtest_forceReferenceChainWalkerMarkMapCommitFailureCounter = extensions->fvtest_forceReferenceChainWalkerMarkMapCommitFailure - 1;
1390
}
1391
continue;
1392
}
1393
1394
if (try_scan(&scan_start, "fvtest_forceReferenceChainWalkerMarkMapCommitFailure")) {
1395
extensions->fvtest_forceReferenceChainWalkerMarkMapCommitFailure = 1;
1396
extensions->fvtest_forceReferenceChainWalkerMarkMapCommitFailureCounter = 0;
1397
continue;
1398
}
1399
1400
if (try_scan(&scan_start, "fvtest_forceCopyForwardHybridMarkCompactRatio=")) {
1401
/* the percentage of the collectionSet regions would like to markCompact instead of copyForward */
1402
if(!scan_udata_helper(vm, &scan_start, &(extensions->fvtest_forceCopyForwardHybridRatio), "fvtest_forceCopyForwardHybridMarkCompactRatio=")) {
1403
returnValue = JNI_EINVAL;
1404
break;
1405
}
1406
if ((extensions->fvtest_forceCopyForwardHybridRatio < 1) || (100 < extensions->fvtest_forceCopyForwardHybridRatio)) {
1407
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTIONS_INTEGER_OUT_OF_RANGE, "fvtest_forceCopyForwardHybridMarkCompactRatio=", (UDATA)1, (UDATA)100);
1408
returnValue = JNI_EINVAL;
1409
break;
1410
}
1411
continue;
1412
}
1413
1414
/* NOTE: this option must be understood by all collectors since it appears in options.default */
1415
if (try_scan(&scan_start, "numaCommonThreadClass=")) {
1416
char * pattern = scan_to_delim(PORTLIB, &scan_start, ',');
1417
if (NULL == pattern) {
1418
returnValue = JNI_ENOMEM;
1419
break;
1420
} else {
1421
const char* needle = NULL;
1422
UDATA needleLength = 0;
1423
U_32 matchFlag = 0;
1424
if (0 == parseWildcard(pattern, strlen(pattern), &needle, &needleLength, &matchFlag)) {
1425
MM_Wildcard *wildcard = MM_Wildcard::newInstance(extensions, matchFlag, needle, needleLength, pattern);
1426
if (NULL != wildcard) {
1427
wildcard->_next = extensions->numaCommonThreadClassNamePatterns;
1428
extensions->numaCommonThreadClassNamePatterns = wildcard;
1429
} else {
1430
returnValue = JNI_ENOMEM;
1431
break;
1432
}
1433
} else {
1434
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTION_MALFORMED, pattern);
1435
j9mem_free_memory(pattern);
1436
returnValue = JNI_EINVAL;
1437
break;
1438
}
1439
}
1440
continue;
1441
}
1442
1443
if (try_scan(&scan_start, "stringTableListToTreeThreshold=")) {
1444
if(!scan_u32_helper(vm, &scan_start, &(extensions->_stringTableListToTreeThreshold), "stringTableListToTreeThreshold=")) {
1445
returnValue = JNI_EINVAL;
1446
break;
1447
}
1448
continue;
1449
}
1450
1451
if (try_scan(&scan_start, "objectListFragmentCount=")) {
1452
if(!scan_udata_helper(vm, &scan_start, &(extensions->objectListFragmentCount), "objectListFragmentCount=")) {
1453
returnValue = JNI_EINVAL;
1454
break;
1455
}
1456
continue;
1457
}
1458
1459
if (try_scan(&scan_start, "minimumFreeSizeForSurvivor=")) {
1460
UDATA size = 0;
1461
if(!scan_udata_helper(vm, &scan_start, &size, "minimumFreeSizeForSurvivor=")) {
1462
returnValue = JNI_EINVAL;
1463
break;
1464
}
1465
if ((size > MAXIMUM_SURVIVOR_MINIMUM_FREESIZE) || (size < MINIMUM_SURVIVOR_MINIMUM_FREESIZE) || (0 != (size & (MINIMUM_SURVIVOR_MINIMUM_FREESIZE-1)))) {
1466
returnValue = JNI_EINVAL;
1467
break;
1468
}
1469
extensions->minimumFreeSizeForSurvivor = size;
1470
continue;
1471
}
1472
1473
if (try_scan(&scan_start, "freeSizeThresholdForSurvivor=")) {
1474
UDATA size = 0;
1475
if(!scan_udata_helper(vm, &scan_start, &size, "freeSizeThresholdForSurvivor=")) {
1476
returnValue = JNI_EINVAL;
1477
break;
1478
}
1479
if ((size > MAXIMUM_SURVIVOR_THRESHOLD) || (size < MINIMUM_SURVIVOR_THRESHOLD) || (0 != (size & (MINIMUM_SURVIVOR_THRESHOLD-1)))) {
1480
returnValue = JNI_EINVAL;
1481
break;
1482
}
1483
extensions->freeSizeThresholdForSurvivor = size;
1484
continue;
1485
}
1486
1487
if (try_scan(&scan_start, "noRecycleRemainders")) {
1488
extensions->recycleRemainders = false;
1489
continue;
1490
}
1491
1492
if (try_scan(&scan_start, "recycleRemainders")) {
1493
extensions->recycleRemainders = true;
1494
continue;
1495
}
1496
1497
if (try_scan(&scan_start, "stringDedupPolicy=")) {
1498
if (try_scan(&scan_start, "disabled")) {
1499
extensions->stringDedupPolicy = MM_GCExtensions::J9_JIT_STRING_DEDUP_POLICY_DISABLED;
1500
} else if (try_scan(&scan_start, "favourLower")) {
1501
extensions->stringDedupPolicy = MM_GCExtensions::J9_JIT_STRING_DEDUP_POLICY_FAVOUR_LOWER;
1502
} else if (try_scan(&scan_start, "favourHigher")) {
1503
extensions->stringDedupPolicy = MM_GCExtensions::J9_JIT_STRING_DEDUP_POLICY_FAVOUR_HIGHER;
1504
} else {
1505
returnValue = JNI_EINVAL;
1506
break;
1507
}
1508
continue;
1509
}
1510
if (try_scan(&scan_start, "darkMatterSampleRate=")) {
1511
if(!scan_udata_helper(vm, &scan_start, &(extensions->darkMatterSampleRate), "darkMatterSampleRate=")) {
1512
returnValue = JNI_EINVAL;
1513
break;
1514
}
1515
continue;
1516
}
1517
1518
1519
/* Couldn't find a match for arguments */
1520
j9nls_printf(PORTLIB, J9NLS_ERROR, J9NLS_GC_OPTION_UNKNOWN, error_scan);
1521
returnValue = JNI_EINVAL;
1522
break;
1523
1524
} /* end loop */
1525
1526
return returnValue;
1527
1528
}
1529
1530
1531