35 lines
1.3 KiB
Java
35 lines
1.3 KiB
Java
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());
|
|
}
|
|
}
|
|
|
|
|
|
}
|