changes
[IRC.git] / Robust / src / Runtime / STM / tm.h
1 #ifndef _TM_H_
2 #define _TM_H_
3 #include "runtime.h"
4 /* ==================
5  * Control Messages
6  * ==================
7  */
8 #define TRANS_SOFT_ABORT    12
9 #define TRANS_ABORT         13
10 #define TRANS_COMMIT        14
11
12
13 /* ========================
14  * Library header files
15  * ========================
16  */
17 #include <stdlib.h>
18 #include <stdio.h>
19 #include <string.h>
20 #include <pthread.h>
21 #include <sys/time.h>
22 #include <errno.h>
23 #include "stmlookup.h"
24 #include "stmlock.h"
25
26 /* ==================================
27  * Bit designation for status field
28  * of object header
29  * ==================================
30  */
31 #define DIRTY 0x01
32 #define NEW   0x02
33 #define LOCK  0x04
34
35 #ifdef COMPILER
36 #include "structdefs.h"
37
38 typedef struct threadrec {
39   int blocked;
40 } threadrec_t;
41
42 typedef struct objheader {
43   unsigned int version;
44   unsigned int lock;          /* reader and writer lock for object header */
45 #ifdef STMSTATS
46   int abortCount;             /* track how many times does this object cause abort */
47   int accessCount;            /* track how many times is this object accessed */
48   threadrec_t *trec;           /* some thread that locked this object */
49   int riskyflag;              /* track how risky is the object */
50   pthread_mutex_t *objlock;    /* lock this object */
51   int padding;
52 #endif
53 } objheader_t;
54
55 #define OID(x) \
56   (*((void **)&((struct ___Object___ *)(((char *) x) + sizeof(objheader_t)))->___objlocation___))
57
58 #define COMPOID(x) \
59   ((((void *) x )!=NULL) ? (*((void **)&((struct ___Object___ *) x)->___objlocation___)) : NULL)
60
61 #define STATUS(x) \
62   *((unsigned int *) &(((struct ___Object___ *)(((char *) x) + sizeof(objheader_t)))->___objstatus___))
63
64 #define STATUSPTR(x) \
65   ((unsigned int *) &(((struct ___Object___ *)(((char *) x) + sizeof(objheader_t)))->___objstatus___))
66
67 #define TYPE(x) \
68   ((struct ___Object___ *)((char *) x + sizeof(objheader_t)))->type
69
70 #define GETSIZE(size, x) { \
71     int type=TYPE(x); \
72     if (type<NUMCLASSES) { \
73       size=classsize[type]; \
74     } else { \
75       size=classsize[type]*((struct ArrayObject *)&((objheader_t *)x)[1])->___length___+sizeof(struct ArrayObject); \
76     } \
77 }
78
79 #else
80 #define OID(x) x->oid
81 #define TYPE(x) x->type
82 #define STATUS(x) x->status
83 #define STATUSPTR(x) &x->status
84 #define GETSIZE(size, x) size=classsize[TYPE(x)]
85 #endif
86
87
88 /* ================================
89  * Constants
90  * ================================
91  */
92 #define DEFAULT_OBJ_STORE_SIZE 1048510 //1MB
93 #define MAXABORTS 2
94 #define NEED_LOCK_THRESHOLD 0.020000
95 #define OSUSED(x) (((unsigned INTPTR)(x)->top)-((unsigned INTPTR) (x+1)))
96 #define OSFREE(x) ((x)->size-OSUSED(x))
97 #define TRANSREAD(x,y,z) { \
98     void * inputvalue; \
99     if ((inputvalue=y)==NULL) x=NULL;\
100          else { \
101            chashlistnode_t * cnodetmp=&c_table[(((unsigned INTPTR)inputvalue)&c_mask)>>4]; \
102            do { \
103              if (cnodetmp->key==inputvalue) {x=cnodetmp->val; break;} \
104              cnodetmp=cnodetmp->next; \
105              if (cnodetmp==NULL) {if (((struct ___Object___*)inputvalue)->___objstatus___&NEW) {x=inputvalue; break;} else \
106                                   {x=transRead(inputvalue,z); asm volatile ("" : "=m" (c_table),"=m" (c_mask)); break;}} \
107            } while(1); \
108          }}
109
110 /* =================================
111  * Data structures
112  * =================================
113  */
114 typedef struct objstr {
115   unsigned int size;       //this many bytes are allocated after this header
116   void *top;
117   struct objstr *next;
118 } objstr_t;
119
120 #define MAXOBJLIST 512
121 struct objlist {
122   int offset;
123   void * objs[MAXOBJLIST];
124   struct objlist * next;
125 };
126
127 extern __thread struct objlist * newobjs;
128 extern __thread objstr_t *t_cache;
129 extern __thread objstr_t *t_reserve;
130 #ifdef STMSTATS
131 typedef struct objlockstate {
132   int offset;
133   pthread_mutex_t lock[MAXOBJLIST];
134   struct objlockstate *next;
135 } objlockstate_t;
136 extern __thread threadrec_t *trec;
137 extern __thread struct objlist * lockedobjs;
138 extern objlockstate_t *objlockscope;
139 pthread_mutex_t lockedobjstore;
140 #endif
141
142
143 /***********************************
144  * Global Variables for statistics
145  **********************************/
146 #ifdef TRANSSTATS
147 extern int numTransCommit;
148 extern int numTransAbort;
149 extern int nSoftAbort;
150 extern int nSoftAbortAbort;
151 extern int nSoftAbortCommit;
152 #endif
153
154 #ifdef STMSTATS
155 extern int typesCausingAbort[];
156 #endif
157
158
159 /* ================================
160  * Functions used
161  * ================================
162  */
163 int stmStartup();
164 void objstrReset();
165 void objstrDelete(objstr_t *store);
166 objstr_t *objstrCreate(unsigned int size);
167 void transStart();
168 objheader_t *transCreateObj(void * ptr, unsigned int size);
169 unsigned int getNewOID(void);
170 void *objstrAlloc(unsigned int size);
171 __attribute__((pure)) void *transRead(void *, void *);
172 #ifdef DELAYCOMP
173 int transCommit(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);
174 int traverseCache(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);
175 int alttraverseCache(void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);
176 void transCommitProcess(void **, int, int, void (*commitmethod)(void *, void *, void *), void * primitives, void * locals, void * params);
177 #else
178 int transCommit();
179 int traverseCache();
180 int alttraverseCache();
181 void transCommitProcess(void **, int);
182 #endif
183 int altalttraverseCache();
184 void transAbortProcess(void **, int);
185 void randomdelay(int);
186 #if defined(STMSTATS)||defined(SOFTABORT)
187 int getTotalAbortCount(int, int, void *, void *, int);
188 #endif
189 #ifdef STMSTATS
190 objheader_t * needLock(objheader_t *, void *);
191 #endif
192 #endif