This repository has been archived on 2024-10-22. You can view files and clone it, but cannot push or open issues or pull requests.
AJP/DiSLProject2022/src-profiler/ex8/Instrumentation.java

48 lines
1.6 KiB
Java

package ex8;
import ch.usi.dag.disl.annotation.After;
import ch.usi.dag.disl.annotation.Before;
import ch.usi.dag.disl.annotation.ThreadLocal;
import ch.usi.dag.disl.dynamiccontext.DynamicContext;
import ch.usi.dag.disl.marker.BodyMarker;
import ch.usi.dag.disl.marker.BytecodeMarker;
import ch.usi.dag.disl.staticcontext.InstructionStaticContext;
import org.objectweb.asm.Opcodes;
public class Instrumentation {
@ThreadLocal
private static long staticCount;
@ThreadLocal
private static long dynamicCount;
@ThreadLocal
private static long specialCount;
@ThreadLocal
private static long virtualCount;
@Before(marker = BytecodeMarker.class,
args = "invokestatic, invokespecial, invokevirtual, invokedynamic")
static void handleInvoke(final InstructionStaticContext isc) {
switch (isc.getOpcode()) {
case Opcodes.INVOKESTATIC -> staticCount++;
case Opcodes.INVOKEDYNAMIC -> dynamicCount++;
case Opcodes.INVOKESPECIAL -> specialCount++;
case Opcodes.INVOKEVIRTUAL -> virtualCount++;
}
}
@After(marker = BodyMarker.class, scope = "void run()", guard = IsNonStaticGuard.class)
static void endThread(final DynamicContext dc) {
if (dc.getThis() instanceof Thread) {
System.out.printf("Thread: %20s - static: %6d - special: %6d - virtual: %6d - dynamic: %6d\n",
((Thread) dc.getThis()).getName(),
staticCount,
specialCount,
virtualCount,
dynamicCount);
}
}
}