8 #define TRANS_SOFT_ABORT 12
10 #define TRANS_COMMIT 14
13 /* ========================
14 * Library header files
15 * ========================
23 #include "stmlookup.h"
26 /* ==================================
27 * Bit designation for status field
29 * ==================================
36 #include "structdefs.h"
38 typedef struct threadrec {
42 typedef struct objheader {
44 unsigned int lock; /* reader and writer lock for object header */
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 */
56 (*((void **)&((struct ___Object___ *)(((char *) x) + sizeof(objheader_t)))->___objlocation___))
59 ((((void *) x )!=NULL) ? (*((void **)&((struct ___Object___ *) x)->___objlocation___)) : NULL)
62 *((unsigned int *) &(((struct ___Object___ *)(((char *) x) + sizeof(objheader_t)))->___objstatus___))
64 #define STATUSPTR(x) \
65 ((unsigned int *) &(((struct ___Object___ *)(((char *) x) + sizeof(objheader_t)))->___objstatus___))
68 ((struct ___Object___ *)((char *) x + sizeof(objheader_t)))->type
70 #define GETSIZE(size, x) { \
72 if (type<NUMCLASSES) { \
73 size=classsize[type]; \
75 size=classsize[type]*((struct ArrayObject *)&((objheader_t *)x)[1])->___length___+sizeof(struct ArrayObject); \
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)]
88 /* ================================
90 * ================================
92 #define DEFAULT_OBJ_STORE_SIZE 1048510 //1MB
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) { \
99 if ((inputvalue=y)==NULL) x=NULL;\
101 chashlistnode_t * cnodetmp=&c_table[(((unsigned INTPTR)inputvalue)&c_mask)>>4]; \
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;}} \
110 /* =================================
112 * =================================
114 typedef struct objstr {
115 unsigned int size; //this many bytes are allocated after this header
120 #define MAXOBJLIST 512
123 void * objs[MAXOBJLIST];
124 struct objlist * next;
127 extern __thread struct objlist * newobjs;
128 extern __thread objstr_t *t_cache;
129 extern __thread objstr_t *t_reserve;
131 typedef struct objlockstate {
133 pthread_mutex_t lock[MAXOBJLIST];
134 struct objlockstate *next;
136 extern __thread threadrec_t *trec;
137 extern __thread struct objlist * lockedobjs;
138 extern objlockstate_t *objlockscope;
139 pthread_mutex_t lockedobjstore;
143 /***********************************
144 * Global Variables for statistics
145 **********************************/
147 extern int numTransCommit;
148 extern int numTransAbort;
149 extern int nSoftAbort;
150 extern int nSoftAbortAbort;
151 extern int nSoftAbortCommit;
155 extern int typesCausingAbort[];
159 /* ================================
161 * ================================
165 void objstrDelete(objstr_t *store);
166 objstr_t *objstrCreate(unsigned int size);
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 *);
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);
180 int alttraverseCache();
181 void transCommitProcess(void **, int);
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);
190 objheader_t * needLock(objheader_t *, void *);