changes
[IRC.git] / Robust / src / Runtime / STM / sandbox.c
1 #include "sandbox.h"
2 #include "tm.h"
3 #include <stdio.h>
4 __thread int transaction_check_counter;
5 __thread jmp_buf aborttrans;
6 __thread int abortenabled;
7 __thread int * counter_reset_pointer;
8 #ifdef DELAYCOMP
9 #include "delaycomp.h"
10 #endif
11
12 void checkObjects() {
13   if (abortenabled&&checktrans()) {
14     printf("Loop Abort\n");
15     transaction_check_counter=(*counter_reset_pointer=HIGH_CHECK_FREQUENCY);
16 #ifdef TRANSSTATS
17     numTransAbort++;
18 #endif
19     freenewobjs();
20     objstrReset();
21     t_chashreset();
22 #ifdef READSET
23     rd_t_chashreset();
24 #endif
25 #ifdef DELAYCOMP
26     dc_t_chashreset();
27     ptrstack.count=0;
28     primstack.count=0;
29     branchstack.count=0;
30 #endif
31     _longjmp(aborttrans, 1);
32   }
33   transaction_check_counter=*counter_reset_pointer;
34 }
35
36 /* Do sandboxing */
37 void errorhandler(int sig, struct sigcontext ctx) {
38   //  printf("Error\n");
39   if (abortenabled&&checktrans()) {
40     sigset_t toclear;
41     sigemptyset(&toclear);
42     sigaddset(&toclear, sig);
43     sigprocmask(SIG_UNBLOCK, &toclear,NULL); 
44 #ifdef TRANSSTATS
45     numTransAbort++;
46 #endif
47     freenewobjs();
48     objstrReset();
49     t_chashreset();
50 #ifdef READSET
51     rd_t_chashreset();
52 #endif
53 #ifdef DELAYCOMP
54     dc_t_chashreset();
55     ptrstack.count=0;
56     primstack.count=0;
57     branchstack.count=0;
58 #endif
59     _longjmp(aborttrans, 1);
60   }
61   threadhandler(sig, ctx);
62 }
63
64 int checktrans() {
65   /* Create info to keep track of objects that can be locked */
66   chashlistnode_t *curr = c_list;
67
68   /* Inner loop to traverse the linked list of the cache lookupTable */
69   while(likely(curr != NULL)) {
70     //if the first bin in hash table is empty
71     objheader_t * headeraddr=&((objheader_t *) curr->val)[-1];
72     objheader_t *header=(objheader_t *)(((char *)curr->key)-sizeof(objheader_t));
73     unsigned int version = headeraddr->version;
74     
75     if (header->lock==0) {
76       return 1;
77     }
78     CFENCE;
79     if (version!=header->version) {
80       return 1;
81     }
82     curr = curr->lnext;
83   }
84   return 0;
85 }