package ex7;
import ch.usi.dag.disl.annotation.After;
import ch.usi.dag.disl.annotation.Before;
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.ClassStaticContext;
import ch.usi.dag.disl.staticcontext.MethodStaticContext;
public class Instrumentation {
@Before(marker = BytecodeMarker.class, args = "MONITORENTER", scope = "ex7.MainThread.*")
static void handleMonitorAccess(final DynamicContext dc) {
final Object monitor = dc.getStackValue(0, Object.class);
Profiler.countMonitorAccess(monitor);
}
@After(marker = BodyMarker.class, scope = "ex7.MainThread.*", guard = IsSynchronizedMethodGuard.class)
static void handledSynchronizedAccess(final MethodStaticContext mc, final DynamicContext dc, final ClassStaticContext cc) {
if (mc.isMethodStatic()) {
try {
Class<?> methodClass = Class.forName(cc.getName());
Profiler.countMonitorAccess(methodClass);
} catch (ClassNotFoundException e) {
throw new RuntimeException("Class " + cc.getName() + " not found");
} else {
Profiler.countMonitorAccess(dc.getThis());