1 /* ============================================================
3 * - single thread commit on local machine
4 * =============================================================
5 * Copyright (c) 2009, University of California, Irvine, USA.
9 * =============================================================
16 /* Per thread transaction variables */
17 __thread objstr_t *t_cache;
18 __thread objstr_t *t_reserve;
19 __thread struct objlist * newobjs;
26 #include "delaycomp.h"
27 __thread struct pointerlist ptrstack;
28 __thread struct primitivelist primstack;
29 __thread struct branchlist branchstack;
30 struct pointerlist *c_ptrstack;
31 struct primitivelist *c_primstack;
32 struct branchlist *c_branchstack;
36 int numTransCommit = 0;
37 int numTransAbort = 0;
39 int nSoftAbortCommit = 0;
40 int nSoftAbortAbort = 0;
43 void * A_memcpy (void * dest, const void * src, size_t count) {
45 INTPTR *desti=(INTPTR *)dest;
46 INTPTR *srci=(INTPTR *)src;
49 while(count>=sizeof(INTPTR)) {
52 count-=sizeof(INTPTR);
57 ((char *)dest)[off]=((char *)src)[off];
63 /* ==================================================
65 * This function starts up the transaction runtime.
66 * ==================================================
72 /* =================================================
74 * This function initializes things required in the
76 * =================================================
79 //Transaction start is currently free...commit and aborting is not
82 c_primstack=&primstack;
83 c_branchstack=&branchstack;
87 /* =======================================================
89 * This function creates objects in the transaction record
90 * =======================================================
92 objheader_t *transCreateObj(void * ptr, unsigned int size) {
93 objheader_t *tmp = mygcmalloc(ptr, (sizeof(objheader_t) + size));
94 objheader_t *retval=&tmp[1];
95 tmp->lock=RW_LOCK_BIAS;
97 //initialize obj lock to the header
99 // don't insert into table
100 if (newobjs->offset<MAXOBJLIST) {
101 newobjs->objs[newobjs->offset++]=retval;
103 struct objlist *tmp=malloc(sizeof(struct objlist));
109 return retval; //want space after object header
112 /* This functions inserts randowm wait delays in the order of msec
113 * Mostly used when transaction commits retry*/
114 void randomdelay(int softaborted) {
118 gettimeofday(&t,NULL);
121 req.tv_nsec = (long)((t.tv_usec)%(1<<softaborted))<<1; //1-11 microsec
122 nanosleep(&req, NULL);
126 /* =============================================================
128 * -finds the objects either in main heap
129 * -copies the object into the transaction cache
130 * =============================================================
133 //void *TR(void *x, void * y, void *z) {
134 // void * inputvalue;
135 // if ((inputvalue=y)==NULL) x=NULL;
137 // chashlistnode_t * cnodetmp=&c_table[(((unsigned INTPTR)inputvalue)&c_mask)>>4];
139 // if (cnodetmp->key==inputvalue) {x=cnodetmp->val; break;}
140 // cnodetmp=cnodetmp->next;
141 // if (cnodetmp==NULL) {if (((struct ___Object___*)inputvalue)->___objstatus___&NEW) {x=inputvalue; break;} else
142 // {x=transRead(inputvalue,z); asm volatile ("" : "=m" (c_table),"\=m" (c_mask)); break;}}
148 //__attribute__ ((pure))
149 void *transRead(void * oid, void *gl) {
150 objheader_t *tmp, *objheader;
151 objheader_t *objcopy;
154 /* Read from the main heap */
156 objheader_t *header = (objheader_t *)(((char *)oid) - sizeof(objheader_t));
157 GETSIZE(size, header);
158 size += sizeof(objheader_t);
159 objcopy = (objheader_t *) objstrAlloc(size);
161 header->accessCount++;
162 if(header->riskyflag) {
163 header=needLock(header,gl);
166 A_memcpy(objcopy, header, size);
168 /* keep track of the object's access sequence in a transaction */
169 objheader_t *tmpheader = objcopy;
170 tmpheader->accessCount = ++t_objnumcount;
173 /* Insert into cache's lookup table */
175 if (((unsigned INTPTR)oid)<((unsigned INTPTR ) curr_heapbase)|| ((unsigned INTPTR)oid) >((unsigned INTPTR) curr_heapptr))
176 printf("ERROR! Bad object address!\n");
177 t_chashInsert(oid, &objcopy[1]);
182 struct objlist *ptr=newobjs;
183 while(ptr->next!=NULL) {
184 struct objlist *tmp=ptr->next;