*** empty log message ***
[IRC.git] / Robust / Transactions / jcarderdstm2version / src / com / enea / jcarder / agent / StaticEventListener.java
1 /*
2  * JCarder -- cards Java programs to keep threads disentangled
3  *
4  * Copyright (C) 2006-2007 Enea AB
5  * Copyright (C) 2007 Ulrik Svensson
6  * Copyright (C) 2007 Joel Rosdahl
7  *
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
10  * details.
11  *
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.
15  */
16
17 package com.enea.jcarder.agent;
18
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;
25 import dstm2.Thread;
26 import java.util.HashMap;
27 import java.util.Vector;
28
29 /**
30  * This class provides static methods that are supposed to be invoked directly
31  * from the instrumented classes.
32  */
33 //@ThreadSafe
34 public final class StaticEventListener{
35
36     private StaticEventListener() { }
37     //private static EventListenerIfc smListener;
38     private static EventListenerIfc smListener;
39     private static HashMap map= new HashMap();
40     
41
42     //public synchronized static void setListener(EventListenerIfc listener) {
43       //  smListener = (EventListener)listener;
44     //}
45     
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;
53       
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);
57       
58       
59       
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);
63       
64       smListener2.atmoicfileds.setELNumberofMonitors(((EventListener)(arg.get(0))).getTrmNumberOfEnteredMonitors().mValue);
65       
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);
69       
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);
73       
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);*/
77       
78     }
79     
80     public  static void setListener(EventListenerIfc listener) {
81          final Vector arg = new Vector();
82          arg.add(listener);
83          Thread.doIt(new Callable<Boolean>() {
84           public Boolean call() throws Exception {
85                 trsetListener(arg);
86                 return true;
87           }
88         });
89     }
90         
91    // }
92
93     public static EventListenerIfc trgetListener() {
94     /*  
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();*/
102         return smListener;
103     }
104     
105     public  static EventListenerIfc getListener() {
106         return Thread.doIt(new Callable<EventListenerIfc>() {
107           public EventListenerIfc call() throws Exception {
108                 return trgetListener();
109           }
110         });
111         
112     }
113
114     /**
115      * This method is expected to be called from the instrumented classes.
116      *
117      * @param monitor
118      *            The monitor object that was acquired. This value is allowed to
119      *            be null.
120      *
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()".
125      *
126      * @param methodWithClass
127      *            The method that acquired the lock, on the format
128      *            "com.enea.jcarder.Foo.bar()".
129      */
130     public static void beforeMonitorEnter(Object monitor,
131                                           String lockReference,
132                                           String methodWithClass) {
133         try {
134             EventListenerIfc listener = getListener();
135             if (listener != null) {
136                 final LockingContext lockingContext =
137                     new LockingContext(Thread.currentThread(),
138                                        lockReference,
139                                        methodWithClass);
140                 listener.beforeMonitorEnter(monitor,
141                                             lockingContext);
142             }
143         } catch (Throwable t) {
144             handleError(t);
145         }
146        // System.out.println("here finito");
147     }
148
149     private static void handleError(Throwable t) {
150         setListener(null);
151         t.printStackTrace();
152     }
153 }