This is an automated email from the ASF dual-hosted git repository. ifesdjeen pushed a commit to branch dev in repository https://gitbox.apache.org/repos/asf/cassandra-simulator.git
commit 8fcc63389bbe71a028eee37023d0ebdc38cfceb0 Author: Alex Petrov <[email protected]> AuthorDate: Tue Aug 4 07:06:27 2026 +0200 Rename --- .../simulator/asm/{Utils.java => AsmUtils.java} | 2 +- .../cassandra/simulator/asm/ClassTransformer.java | 20 ++++---- .../simulator/asm/GlobalMethodTransformer.java | 2 +- .../cassandra/simulator/asm/InterceptAgent.java | 2 +- .../cassandra/simulator/asm/InterceptClasses.java | 6 +-- .../apache/cassandra/simulator/asm/Simulate.java | 56 ++++++++++++++++++++++ .../org/apache/cassandra/simulator/Simulator.java | 1 + 7 files changed, 73 insertions(+), 16 deletions(-) diff --git a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/Utils.java b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/AsmUtils.java similarity index 99% rename from simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/Utils.java rename to simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/AsmUtils.java index d710ffe..55b9255 100644 --- a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/Utils.java +++ b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/AsmUtils.java @@ -37,7 +37,7 @@ import static org.objectweb.asm.Opcodes.ATHROW; import static org.objectweb.asm.Opcodes.F_SAME1; import static org.objectweb.asm.Opcodes.INVOKESTATIC; -public class Utils +public class AsmUtils { public static String toInternalName(Class<?> clazz) { diff --git a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/ClassTransformer.java b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/ClassTransformer.java index b79715c..eb900f2 100644 --- a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/ClassTransformer.java +++ b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/ClassTransformer.java @@ -43,9 +43,9 @@ import static org.apache.cassandra.simulator.asm.Flag.NEMESIS; import static org.apache.cassandra.simulator.asm.Flag.NO_PROXY_METHODS; import static org.apache.cassandra.simulator.asm.TransformationKind.HASHCODE; import static org.apache.cassandra.simulator.asm.TransformationKind.SYNCHRONIZED; -import static org.apache.cassandra.simulator.asm.Utils.deterministicToString; -import static org.apache.cassandra.simulator.asm.Utils.generateTryFinallyProxyCall; -import static org.apache.cassandra.simulator.asm.Utils.visitEachRefType; +import static org.apache.cassandra.simulator.asm.AsmUtils.deterministicToString; +import static org.apache.cassandra.simulator.asm.AsmUtils.generateTryFinallyProxyCall; +import static org.apache.cassandra.simulator.asm.AsmUtils.visitEachRefType; import static org.objectweb.asm.Opcodes.ACC_PRIVATE; import static org.objectweb.asm.Opcodes.ACC_STATIC; import static org.objectweb.asm.Opcodes.ACC_SYNTHETIC; @@ -67,35 +67,35 @@ class ClassTransformer extends ClassVisitor implements MethodWriterSink public void visitTypeInsn(int opcode, String type) { super.visitTypeInsn(opcode, type); - Utils.visitIfRefType(type, dependentTypes); + AsmUtils.visitIfRefType(type, dependentTypes); } @Override public void visitFieldInsn(int opcode, String owner, String name, String descriptor) { super.visitFieldInsn(opcode, owner, name, descriptor); - Utils.visitIfRefType(descriptor, dependentTypes); + AsmUtils.visitIfRefType(descriptor, dependentTypes); } @Override public void visitMethodInsn(int opcode, String owner, String name, String descriptor, boolean isInterface) { super.visitMethodInsn(opcode, owner, name, descriptor, isInterface); - Utils.visitEachRefType(descriptor, dependentTypes); + AsmUtils.visitEachRefType(descriptor, dependentTypes); } @Override public void visitInvokeDynamicInsn(String name, String descriptor, Handle bootstrapMethodHandle, Object... bootstrapMethodArguments) { super.visitInvokeDynamicInsn(name, descriptor, bootstrapMethodHandle, bootstrapMethodArguments); - Utils.visitEachRefType(descriptor, dependentTypes); + AsmUtils.visitEachRefType(descriptor, dependentTypes); } @Override public void visitLocalVariable(String name, String descriptor, String signature, Label start, Label end, int index) { super.visitLocalVariable(name, descriptor, signature, start, end, index); - Utils.visitIfRefType(descriptor, dependentTypes); + AsmUtils.visitIfRefType(descriptor, dependentTypes); } } @@ -207,7 +207,7 @@ class ClassTransformer extends ClassVisitor implements MethodWriterSink public FieldVisitor visitField(int access, String name, String descriptor, String signature, Object value) { if (dependentTypes != null) - Utils.visitIfRefType(descriptor, dependentTypes); + AsmUtils.visitIfRefType(descriptor, dependentTypes); // org.apache.cassandra.simulator.systems.SimulatedTime.InstanceTime.nanoTime does not change between invokes which causes AbstractQueuedSynchronizer to loop forever, // so need to make the threshold negative to avoid the spin loop. if (className.equals("java/util/concurrent/locks/AbstractQueuedSynchronizer") && name.equals("SPIN_FOR_TIMEOUT_THRESHOLD")) @@ -308,7 +308,7 @@ class ClassTransformer extends ClassVisitor implements MethodWriterSink @Override public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { - return Utils.checkForSimulationAnnotations(api, descriptor, super.visitAnnotation(descriptor, visible), (flag, add) -> { + return AsmUtils.checkForSimulationAnnotations(api, descriptor, super.visitAnnotation(descriptor, visible), (flag, add) -> { if (add) flags.add(flag); else flags.remove(flag); }); diff --git a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/GlobalMethodTransformer.java b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/GlobalMethodTransformer.java index 562104d..a09e0b1 100644 --- a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/GlobalMethodTransformer.java +++ b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/GlobalMethodTransformer.java @@ -311,7 +311,7 @@ class GlobalMethodTransformer extends MethodVisitor @Override public AnnotationVisitor visitAnnotation(String descriptor, boolean visible) { - return Utils.checkForSimulationAnnotations(api, descriptor, super.visitAnnotation(descriptor, visible), (flag, add) -> { + return AsmUtils.checkForSimulationAnnotations(api, descriptor, super.visitAnnotation(descriptor, visible), (flag, add) -> { switch (flag) { default: throw new AssertionError(); diff --git a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/InterceptAgent.java b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/InterceptAgent.java index aa33906..4d95090 100644 --- a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/InterceptAgent.java +++ b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/InterceptAgent.java @@ -212,7 +212,7 @@ public class InterceptAgent public MethodVisitor visitMethod(int access, String name, String descriptor, String signature, String[] exceptions) { if (descriptor.equals("()Ljava/lang/String;") && name.equals("toString")) - return Utils.deterministicToString(super.visitMethod(access, name, descriptor, signature, exceptions)); + return AsmUtils.deterministicToString(super.visitMethod(access, name, descriptor, signature, exceptions)); else return super.visitMethod(access, name, descriptor, signature, exceptions); } diff --git a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/InterceptClasses.java b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/InterceptClasses.java index 69e36b6..16942ff 100644 --- a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/InterceptClasses.java +++ b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/InterceptClasses.java @@ -312,7 +312,7 @@ public class InterceptClasses implements BiFunction<String, byte[], byte[]> static final String shadowRootExternalType = "org.apache.cassandra.simulator.systems.InterceptibleConcurrentHashMap"; static final String shadowRootType = "org/apache/cassandra/simulator/systems/InterceptibleConcurrentHashMap"; - static final String originalRootType = Utils.toInternalName(ConcurrentHashMap.class); + static final String originalRootType = AsmUtils.toInternalName(ConcurrentHashMap.class); static final String shadowOuterTypePrefix = shadowRootType + '$'; static final String originalOuterTypePrefix = originalRootType + '$'; @@ -323,7 +323,7 @@ public class InterceptClasses implements BiFunction<String, byte[], byte[]> try { - String originalType, shadowType = Utils.toInternalName(externalName); + String originalType, shadowType = AsmUtils.toInternalName(externalName); if (!shadowType.startsWith(shadowOuterTypePrefix)) originalType = originalRootType; else @@ -339,7 +339,7 @@ public class InterceptClasses implements BiFunction<String, byte[], byte[]> originalType, shadowType, originalRootType, shadowRootType, originalOuterTypePrefix, shadowOuterTypePrefix, flags, monitorDelayChance.apply(hashCode), nemesis, nemesisFieldSelector, null); - transformer.readAndTransform(Utils.readDefinition(originalType + ".class")); + transformer.readAndTransform(AsmUtils.readDefinition(originalType + ".class")); return transformer.toBytes(); } catch (IOException e) diff --git a/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/Simulate.java b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/Simulate.java new file mode 100644 index 0000000..0426e3f --- /dev/null +++ b/simulator-asm/src/main/java/org/apache/cassandra/simulator/asm/Simulate.java @@ -0,0 +1,56 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one + * or more contributor license agreements. See the NOTICE file + * distributed with this work for additional information + * regarding copyright ownership. The ASF licenses this file + * to you under the Apache License, Version 2.0 (the + * "License"); you may not use this file except in compliance + * with the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.apache.cassandra.simulator.asm; + +/** + * Enable certain features for a specific method or class. + * + * Note that presently class level annotations are not inherited by inner classes. + * + * TODO: support package level, and apply to all nested classes + */ +public @interface Simulate +{ + enum With + { + /** + * Calls to FBUtilities.timestampMicros() will be guaranteed globally monotonically increasing. + * + * May be annotated at the method or class level. + */ + GLOBAL_CLOCK, + + /** + * synchronized methods and blocks, and wait/notify. + * + * May be annotated at the class level. + */ + MONITORS, + + /** + * Usages of LockSupport. This defaults to ON for all classes, including system classes. + * + * May be annotated at the method or class level. + */ + LOCK_SUPPORT + } + + With[] with() default {}; + With[] without() default {}; +} \ No newline at end of file diff --git a/simulator-core/src/main/java/org/apache/cassandra/simulator/Simulator.java b/simulator-core/src/main/java/org/apache/cassandra/simulator/Simulator.java index 709b976..88625e1 100644 --- a/simulator-core/src/main/java/org/apache/cassandra/simulator/Simulator.java +++ b/simulator-core/src/main/java/org/apache/cassandra/simulator/Simulator.java @@ -108,6 +108,7 @@ public class Simulator implements AutoCloseable private final Debug debug; private final ClassLoader classLoader; private final ThreadGroup threadGroup; + // TODO: this should be improved; rather than storing the prefix here, we should instead store the policy private final String classTransformationPrefix; private final AtomicReference<Throwable> firstUncaught = new AtomicReference<>(); private final float monitorDelayChance; --------------------------------------------------------------------- To unsubscribe, e-mail: [email protected] For additional commands, e-mail: [email protected]
