Skip to content

Commit e599459

Browse files
authoredJan 12, 2023
7903383: jcstress: All State objects should be processed
1 parent 8b8b812 commit e599459

File tree

4 files changed

+69
-53
lines changed

4 files changed

+69
-53
lines changed
 

‎jcstress-core/src/main/java/org/openjdk/jcstress/TestExecutor.java

+6-2
Original file line numberDiff line numberDiff line change
@@ -270,10 +270,13 @@ void generateDirectives() throws IOException {
270270
pw.println(" inline: \"-" + task.generatedRunnerName + "::" + JCStressTestProcessor.RUN_LOOP_PREFIX + "*\",");
271271

272272
// Force inline the auxiliary methods and classes in the run loop
273-
pw.println(" inline: \"+" + task.generatedRunnerName + "::" + JCStressTestProcessor.AUX_PREFIX + "*\",");
273+
pw.println(" inline: \"+" + task.generatedRunnerName + "::" + JCStressTestProcessor.CONSUME_PREFIX + "*\",");
274274
pw.println(" inline: \"+" + WorkerSync.class.getName() + "::*\",");
275275
pw.println(" inline: \"+java.util.concurrent.atomic.*::*\",");
276276

277+
// Omit inlining of non-essential methods
278+
pw.println(" inline: \"-" + task.generatedRunnerName + "::" + JCStressTestProcessor.CONSUME_NI_PREFIX + "*\",");
279+
277280
// The test is running in resource-constrained JVM. Block the task loop execution until
278281
// compiled code is available. This would allow compilers to work in relative peace.
279282
pw.println(" BackgroundCompilation: false,");
@@ -299,7 +302,8 @@ void generateDirectives() throws IOException {
299302

300303
pw.println(" {");
301304
pw.println(" match: \"" + task.generatedRunnerName + "::" + JCStressTestProcessor.RUN_LOOP_PREFIX + an + "\",");
302-
pw.println(" inline: \"+" + task.generatedRunnerName + "::" + JCStressTestProcessor.AUX_PREFIX + "*\",");
305+
pw.println(" inline: \"+" + task.generatedRunnerName + "::" + JCStressTestProcessor.CONSUME_PREFIX + "*\",");
306+
pw.println(" inline: \"-" + task.generatedRunnerName + "::" + JCStressTestProcessor.CONSUME_NI_PREFIX + "*\",");
303307

304308
// Force inline of actor methods if run in compiled mode: this would inherit
305309
// compiler for them. Forbid inlining of actor methods in interpreted mode:

‎jcstress-core/src/main/java/org/openjdk/jcstress/infra/processors/JCStressTestProcessor.java

+59-47
Original file line numberDiff line numberDiff line change
@@ -52,9 +52,10 @@ public class JCStressTestProcessor extends AbstractProcessor {
5252

5353
private final List<TestInfo> tests = new ArrayList<>();
5454

55-
public static final String TASK_LOOP_PREFIX = "task_";
56-
public static final String RUN_LOOP_PREFIX = "run_";
57-
public static final String AUX_PREFIX = "jcstress_";
55+
public static final String TASK_LOOP_PREFIX = "jcstress_task_";
56+
public static final String RUN_LOOP_PREFIX = "jcstress_run_";
57+
public static final String CONSUME_PREFIX = "jcstress_consume_";
58+
public static final String CONSUME_NI_PREFIX = "jcstress_ni_consume_";
5859

5960
@Override
6061
public SourceVersion getSupportedSourceVersion() {
@@ -478,7 +479,7 @@ private void generateContinuous(TestInfo info) {
478479
pw.println(" }");
479480
pw.println(" workerSync = new WorkerSync(false, " + actorsCount + ", config.spinLoopStyle);");
480481
pw.println();
481-
pw.println(" control.isStopped = false;");
482+
pw.println(" control.stopping = false;");
482483
pw.println();
483484

484485
// Initialize affinity before starting the timing measurement, so that init time
@@ -510,56 +511,65 @@ private void generateContinuous(TestInfo info) {
510511
pw.println(" }");
511512
pw.println(" }");
512513
pw.println();
513-
pw.println(" control.isStopped = true;");
514+
pw.println(" control.stopping = true;");
514515
pw.println();
515516
pw.println(" return threads;");
516517
pw.println(" }");
517518
pw.println();
518519

519-
pw.println(" private void " + AUX_PREFIX + "consume(Counter<" + r + "> cnt, int a) {");
520-
pw.println(" " + s + "[] ls = gs;");
521-
pw.println(" " + r + "[] lr = gr;");
522-
pw.println(" int len = config.strideSize * config.strideCount;");
523-
pw.println(" int left = a * len / " + actorsCount + ";");
524-
pw.println(" int right = (a + 1) * len / " + actorsCount + ";");
525-
pw.println(" for (int c = left; c < right; c++) {");
526-
pw.println(" " + r + " r = lr[c];");
527-
pw.println(" " + s + " s = ls[c];");
520+
for (boolean reinit : new boolean[] { false, true }) {
521+
String name = reinit ? (CONSUME_PREFIX + "reinit") : (CONSUME_NI_PREFIX + "final");
522+
pw.println(" private void " + name + "(Counter<" + r + "> cnt, int a) {");
523+
pw.println(" " + s + "[] ls = gs;");
524+
pw.println(" " + r + "[] lr = gr;");
525+
pw.println(" int len = config.strideSize * config.strideCount;");
526+
pw.println(" int left = a * len / " + actorsCount + ";");
527+
pw.println(" int right = (a + 1) * len / " + actorsCount + ";");
528+
pw.println(" for (int c = left; c < right; c++) {");
529+
pw.println(" " + r + " r = lr[c];");
530+
pw.println(" " + s + " s = ls[c];");
528531

529-
if (info.getArbiter() != null) {
530-
if (isStateItself) {
531-
emitMethod(pw, info.getArbiter(), " s." + info.getArbiter().getSimpleName(), "s", "r", true);
532-
} else {
533-
emitMethod(pw, info.getArbiter(), " test." + info.getArbiter().getSimpleName(), "s", "r", true);
532+
if (info.getArbiter() != null) {
533+
if (isStateItself) {
534+
emitMethod(pw, info.getArbiter(), " s." + info.getArbiter().getSimpleName(), "s", "r", true);
535+
} else {
536+
emitMethod(pw, info.getArbiter(), " test." + info.getArbiter().getSimpleName(), "s", "r", true);
537+
}
534538
}
535-
}
536539

537-
// If state is trivial, we can reset its fields directly, without
538-
// reallocating the object.
539-
540-
if (allFieldsAreDefault(info.getState())) {
541-
for (VariableElement var : ElementFilter.fieldsIn(info.getState().getEnclosedElements())) {
542-
if (var.getModifiers().contains(Modifier.STATIC)) continue;
543-
pw.print(" s." + var.getSimpleName().toString() + " = ");
544-
pw.print(getDefaultVal(var));
545-
pw.println(";");
540+
if (reinit) {
541+
// If state is trivial, we can reset its fields directly, without
542+
// reallocating the object.
543+
544+
if (allFieldsAreDefault(info.getState())) {
545+
for (VariableElement var : ElementFilter.fieldsIn(info.getState().getEnclosedElements())) {
546+
if (var.getModifiers().contains(Modifier.STATIC))
547+
continue;
548+
pw.print(" s." + var.getSimpleName().toString() + " = ");
549+
pw.print(getDefaultVal(var));
550+
pw.println(";");
551+
}
552+
} else {
553+
pw.println(" ls[c] = new " + s + "();");
554+
}
546555
}
547-
} else {
548-
pw.println(" ls[c] = new " + s + "();");
549-
}
550556

551-
pw.println(" cnt.record(r, 1);");
557+
pw.println(" cnt.record(r, 1);");
552558

553-
for (VariableElement var : ElementFilter.fieldsIn(info.getResult().getEnclosedElements())) {
554-
if (var.getSimpleName().toString().equals("jcstress_trap")) continue;
555-
pw.print(" r." + var.getSimpleName().toString() + " = ");
556-
pw.print(getDefaultVal(var));
557-
pw.println(";");
558-
}
559+
if (reinit) {
560+
for (VariableElement var : ElementFilter.fieldsIn(info.getResult().getEnclosedElements())) {
561+
if (var.getSimpleName().toString().equals("jcstress_trap"))
562+
continue;
563+
pw.print(" r." + var.getSimpleName().toString() + " = ");
564+
pw.print(getDefaultVal(var));
565+
pw.println(";");
566+
}
567+
}
559568

560-
pw.println(" }");
561-
pw.println(" }");
562-
pw.println();
569+
pw.println(" }");
570+
pw.println(" }");
571+
pw.println();
572+
}
563573

564574
int n = 0;
565575
for (ExecutableElement a : info.getActors()) {
@@ -571,18 +581,20 @@ private void generateContinuous(TestInfo info) {
571581
pw.println(" if (config.localAffinity) AffinitySupport.bind(config.localAffinityMap[" + n + "]);");
572582
pw.println(" while (true) {");
573583
pw.println(" WorkerSync sync = workerSync;");
574-
pw.println(" if (sync.stopped) {");
575-
pw.println(" return counter;");
576-
pw.println(" }");
577584
pw.println(" int check = 0;");
578585
pw.println(" for (int start = 0; start < len; start += stride) {");
579586
pw.println(" " + RUN_LOOP_PREFIX + a.getSimpleName() + "(gs, gr, start, start + stride);");
580587
pw.println(" check += " + actorsCount + ";");
581588
pw.println(" sync.awaitCheckpoint(check);");
582589
pw.println(" }");
583-
pw.println(" " + AUX_PREFIX + "consume(counter, " + n + ");");
590+
pw.println(" if (sync.stopping) {");
591+
pw.println(" " + CONSUME_NI_PREFIX + "final(counter, " + n + ");");
592+
pw.println(" return counter;");
593+
pw.println(" } else {");
594+
pw.println(" " + CONSUME_PREFIX + "reinit(counter, " + n + ");");
595+
pw.println(" }");
584596
pw.println(" if (sync.tryStartUpdate()) {");
585-
pw.println(" workerSync = new WorkerSync(control.isStopped, " + actorsCount + ", config.spinLoopStyle);");
597+
pw.println(" workerSync = new WorkerSync(control.stopping, " + actorsCount + ", config.spinLoopStyle);");
586598
pw.println(" }");
587599
pw.println(" sync.postUpdate();");
588600
pw.println(" }");

‎jcstress-core/src/main/java/org/openjdk/jcstress/infra/runners/Control.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@
2828
* @author Aleksey Shipilev (aleksey.shipilev@oracle.com)
2929
*/
3030
public class Control {
31-
public volatile boolean isStopped;
31+
public volatile boolean stopping;
3232
}

‎jcstress-core/src/main/java/org/openjdk/jcstress/infra/runners/WorkerSync.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535
@jdk.internal.vm.annotation.Contended
3636
public class WorkerSync {
3737

38-
public final boolean stopped;
38+
public final boolean stopping;
3939
public final SpinLoopStyle spinStyle;
4040

4141
private volatile int notConsumed;
@@ -46,8 +46,8 @@ public class WorkerSync {
4646
static final AtomicIntegerFieldUpdater<WorkerSync> UPDATER_NOT_UPDATED = AtomicIntegerFieldUpdater.newUpdater(WorkerSync.class, "notUpdated");
4747
static final AtomicIntegerFieldUpdater<WorkerSync> UPDATER_CHECKPOINT = AtomicIntegerFieldUpdater.newUpdater(WorkerSync.class, "checkpoint");
4848

49-
public WorkerSync(boolean stopped, int expectedWorkers, SpinLoopStyle spinStyle) {
50-
this.stopped = stopped;
49+
public WorkerSync(boolean stopping, int expectedWorkers, SpinLoopStyle spinStyle) {
50+
this.stopping = stopping;
5151
this.spinStyle = spinStyle;
5252
this.notConsumed = expectedWorkers;
5353
this.notUpdated = expectedWorkers;

0 commit comments

Comments
 (0)
Please sign in to comment.