2 * JCarder -- cards Java programs to keep threads disentangled
4 * Copyright (C) 2006-2007 Enea AB
5 * Copyright (C) 2007 Ulrik Svensson
6 * Copyright (C) 2007 Joel Rosdahl
8 * This program is made available under the GNU GPL version 2, with a special
9 * exception for linking with JUnit. See the accompanying file LICENSE.txt for
12 * This program is distributed in the hope that it will be useful, but WITHOUT
13 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
14 * FITNESS FOR A PARTICULAR PURPOSE.
17 package com.enea.jcarder.agent;
19 //import net.jcip.annotations.ThreadSafe;
20 import com.enea.jcarder.common.LockingContext;
21 import com.enea.jcarder.common.events.EventFileWriter;
22 import com.enea.jcarder.transactionalinterfaces.trEventListener;
23 import dstm2.AtomicSuperClass;
24 import java.util.concurrent.Callable;
26 import java.util.HashMap;
27 import java.util.Vector;
30 * This class provides static methods that are supposed to be invoked directly
31 * from the instrumented classes.
34 public final class StaticEventListener{
36 private StaticEventListener() { }
37 //private static EventListenerIfc smListener;
38 private static EventListenerIfc smListener;
39 private static HashMap map= new HashMap();
42 //public synchronized static void setListener(EventListenerIfc listener) {
43 // smListener = (EventListener)listener;
46 public static void trsetListener(Vector listener) {
47 //smListener = ((EventListener)(arg.get(0)));
48 smListener = (EventListenerIfc)listener.get(0);
49 // smListener = new EventListener((EventListener)(arg.get(0)));
50 // smListener.listener = new trEventListener();
51 // smListener.listener.atmoicfileds = trEventListener.factory.create();
52 // smListener.listener.atmoicfileds = ((EventListener)(arg.get(0))).listener.atmoicfileds;
54 /*smListener2.atmoicfileds.setCCByteBuffer(((EventListener)(arg.get(0))).getMContextCache().getMContextWriter().getMbuff().mbuffer);
55 smListener2.atmoicfileds.setCCPosiiton(((EventListener)(arg.get(0))).getMContextCache().getMContextWriter().getTest().pos);
56 smListener2.atmoicfileds.setCCShutdown(((EventListener)(arg.get(0))).getMContextCache().getMContextWriter().getShutdownHookExecuted().boolif);
60 smListener2.atmoicfileds.setHMap1Capacity(((EventListener)(arg.get(0))).getMContextCache().getMCache().capacity);
61 smListener2.atmoicfileds.setHMap1Position(((EventListener)(arg.get(0))).getMContextCache().getMCache().position);
62 smListener2.atmoicfileds.setHMap1Values(((EventListener)(arg.get(0))).getMContextCache().getMCache().values);
64 smListener2.atmoicfileds.setELNumberofMonitors(((EventListener)(arg.get(0))).getTrmNumberOfEnteredMonitors().mValue);
66 smListener2.atmoicfileds.setLIGByteBuffer(((EventListener)(arg.get(0))).getMLockIdGenerator().getMContextWriter().getMbuff().mbuffer);
67 smListener2.atmoicfileds.setLIGPosiiton(((EventListener)(arg.get(0))).getMLockIdGenerator().getMContextWriter().getTest().pos);
68 smListener2.atmoicfileds.setLIGShutdown(((EventListener)(arg.get(0))).getMLockIdGenerator().getMContextWriter().getShutdownHookExecuted().boolif);
70 smListener2.atmoicfileds.setHMap2Capacity(((EventListener)(arg.get(0))).getMLockIdGenerator().getMIdMap().capacity);
71 smListener2.atmoicfileds.setHMap2Position(((EventListener)(arg.get(0))).getMLockIdGenerator().getMIdMap().position);
72 smListener2.atmoicfileds.setHMap2Values(((EventListener)(arg.get(0))).getMLockIdGenerator().getMIdMap().values);
74 smListener2.atmoicfileds.setEFWByteBuffer(((EventFileWriter)((EventListener)(arg.get(0))).getMLockEventListener()).getMbuff().mbuffer);
75 smListener2.atmoicfileds.setEFWShutdown(((EventFileWriter)((EventListener)(arg.get(0))).getMLockEventListener()).getShutdownHookExecuted().boolif);
76 smListener2.atmoicfileds.setEFWCounter(((EventFileWriter)((EventListener)(arg.get(0))).getMLockEventListener()).getTrmWrittenLockEvents().mValue);*/
80 public static void setListener(EventListenerIfc listener) {
81 final Vector arg = new Vector();
83 Thread.doIt(new Callable<Boolean>() {
84 public Boolean call() throws Exception {
93 public static EventListenerIfc trgetListener() {
95 ((EventListener)smListener).getMContextCache().getMCache().capacity.getPosition();
96 ((EventListener)smListener).getMContextCache().getMCache().position.getPosition();
97 ((EventListener)smListener).getMContextCache().getMCache().values.getValues();
98 ((EventListener)smListener).getTrmNumberOfEnteredMonitors().mValue.getPosition();
99 ((EventListener)smListener).getMLockIdGenerator().getMIdMap().capacity.getPosition();
100 ((EventListener)smListener).getMLockIdGenerator().getMIdMap().position.getPosition();
101 ((EventListener)smListener).getMLockIdGenerator().getMIdMap().values.getValues();*/
105 public static EventListenerIfc getListener() {
106 return Thread.doIt(new Callable<EventListenerIfc>() {
107 public EventListenerIfc call() throws Exception {
108 return trgetListener();
115 * This method is expected to be called from the instrumented classes.
118 * The monitor object that was acquired. This value is allowed to
121 * @param lockReference
122 * A textual description of how the lock object was addressed.
123 * For example: "this", "com.enea.jcarder.Foo.mBar" or
124 * "com.enea.jcarder.Foo.getLock()".
126 * @param methodWithClass
127 * The method that acquired the lock, on the format
128 * "com.enea.jcarder.Foo.bar()".
130 public static void beforeMonitorEnter(Object monitor,
131 String lockReference,
132 String methodWithClass) {
134 EventListenerIfc listener = getListener();
135 if (listener != null) {
136 final LockingContext lockingContext =
137 new LockingContext(Thread.currentThread(),
140 listener.beforeMonitorEnter(monitor,
143 } catch (Throwable t) {
146 // System.out.println("here finito");
149 private static void handleError(Throwable t) {