finally fix bug...after a full day on this one.
authorbdemsky <bdemsky>
Thu, 16 Apr 2009 05:58:59 +0000 (05:58 +0000)
committerbdemsky <bdemsky>
Thu, 16 Apr 2009 05:58:59 +0000 (05:58 +0000)
Robust/src/Runtime/STM/stm.c
Robust/src/Runtime/STM/tm.h
Robust/src/Runtime/garbage.c
Robust/src/Runtime/garbage.h

index 84a0ab644e326e71cbc329a1ba0b9873b38be0ca..89815bb6b307a02a927f282b47870edeeb229406 100644 (file)
@@ -109,13 +109,14 @@ objheader_t *transCreateObj(void * ptr, unsigned int size) {
 
 /* This functions inserts randowm wait delays in the order of msec
  * Mostly used when transaction commits retry*/
-void randomdelay() {
+void randomdelay(int softaborted) {
   struct timespec req;
-  time_t t;
+  struct timeval t;
+
+  gettimeofday(&t,NULL);
 
-  t = time(NULL);
   req.tv_sec = 0;
-  req.tv_nsec = (long)(t%4); //1-11 microsec
+  req.tv_nsec = (long)((t.tv_usec)%(1<<softaborted))<<1; //1-11 microsec
   nanosleep(&req, NULL);
   return;
 }
@@ -253,9 +254,16 @@ int transCommit() {
     if(finalResponse == TRANS_SOFT_ABORT) {
 #ifdef TRANSSTATS
       nSoftAbort++;
-      softaborted=1;
+      softaborted++;
 #endif
-      randomdelay();
+      if (softaborted>4) {
+       //retry if to many soft aborts
+       freenewobjs();
+       objstrReset();
+       t_chashreset();
+       return TRANS_ABORT;
+      }
+      randomdelay(softaborted);
     } else {
       printf("Error: in %s() Unknown outcome", __func__);
       exit(-1);
@@ -314,16 +322,17 @@ int traverseCache() {
            return TRANS_ABORT;
          }
        } else { /* cannot aquire lock */
-         if(version == header->version) /* versions match */
+         if(version == header->version) {
+           /* versions match */
            softabort=1;
-         else {
+         else {
            transAbortProcess(oidrdlocked, &numoidrdlocked, oidwrlocked, &numoidwrlocked);
            return TRANS_ABORT;
          }
        }
       } else {
        /* Read from the main heap  and compare versions */
-       if(read_trylock(&header->lock)) { //can further aquire read locks
+       if(read_trylock(&header->lock)) { //can further acquire read locks
          if(version == header->version) {/* versions match */
            oidrdlocked[numoidrdlocked++] = OID(header);
          } else {
@@ -332,9 +341,9 @@ int traverseCache() {
            return TRANS_ABORT;
          }
        } else { /* cannot aquire lock */
-         if(version == header->version)
+         if(version == header->version) {
            softabort=1;
-         else {
+         else {
            transAbortProcess(oidrdlocked, &numoidrdlocked, oidwrlocked, &numoidwrlocked);
            return TRANS_ABORT;
          }
@@ -400,9 +409,10 @@ int alttraverseCache() {
          return TRANS_ABORT;
        }
       } else { /* cannot aquire lock */
-       if(version == header->version) /* versions match */
+       if(version == header->version) {
+         /* versions match */
          softabort=1;
-       else {
+       else {
          transAbortProcess(oidrdlocked, &numoidrdlocked, oidwrlocked, &numoidwrlocked);
          return TRANS_ABORT;
        }
@@ -418,9 +428,9 @@ int alttraverseCache() {
          return TRANS_ABORT;
        }
       } else { /* cannot aquire lock */
-       if(version == header->version)
+       if(version == header->version) {
          softabort=1;
-       else {
+       else {
          transAbortProcess(oidrdlocked, &numoidrdlocked, oidwrlocked, &numoidwrlocked);
          return TRANS_ABORT;
        }
index 5f7015885a946fce2357073fa98d0a30b85e9a01..1da40df5e44f337d96c829f92a96b14f64c2ffc9 100644 (file)
@@ -148,6 +148,6 @@ int traverseCache();
 int alttraverseCache();
 int transAbortProcess(void **, int *, void **, int *);
 int transCommmitProcess(void **, int *, void **, int *);
-void randomdelay();
+void randomdelay(int);
 
 #endif
index 5289c4ed6fa8c393abc605f5f60cdd1b179548f3..182342d160ab4128bb5adbef51c9c8fb33f60b7d 100644 (file)
@@ -147,7 +147,7 @@ void fixobjlist(struct objlist * ptr) {
   }
 }
 
-void fixtable(chashlistnode_t ** tc_table, chashlistnode_t **tc_list, unsigned int tc_size) {
+void fixtable(chashlistnode_t ** tc_table, chashlistnode_t **tc_list, cliststruct_t **cstr, unsigned int tc_size) {
   unsigned int mask=(tc_size<<4)-1;
   chashlistnode_t *node=calloc(tc_size, sizeof(chashlistnode_t));
   chashlistnode_t *ptr=*tc_table;
@@ -212,14 +212,14 @@ void fixtable(chashlistnode_t ** tc_table, chashlistnode_t **tc_list, unsigned i
        newlist=tmp;
       } else if (isfirst) {
        chashlistnode_t *newnode;
-       if (c_structs->num<NUMCLIST) {
-         newnode=&c_structs->array[c_structs->num];
-         c_structs->num++;
+       if ((*cstr)->num<NUMCLIST) {
+         newnode=&(*cstr)->array[(*cstr)->num];
+         (*cstr)->num++;
        } else {
          //get new list
          cliststruct_t *tcl=calloc(1,sizeof(cliststruct_t));
-         tcl->next=c_structs;
-         c_structs=tcl;
+         tcl->next=*cstr;
+         *cstr=tcl;
          newnode=&tcl->array[0];
          tcl->num=1;
        }
@@ -300,7 +300,7 @@ void collect(struct garbagelist * stackptr) {
 
 #ifdef STM
   if (c_table!=NULL) {
-    fixtable(&c_table, &c_list, c_size);
+    fixtable(&c_table, &c_list, &c_structs, c_size);
     fixobjlist(newobjs);
   }
   memorybase=NULL;
@@ -330,7 +330,7 @@ void collect(struct garbagelist * stackptr) {
 #endif
 #ifdef STM
     if ((*listptr->tc_table)!=NULL) {
-      fixtable(listptr->tc_table, listptr->tc_list, listptr->tc_size);
+      fixtable(listptr->tc_table, listptr->tc_list, listptr->tc_structs, listptr->tc_size);
       fixobjlist(listptr->objlist);
     }
     *(listptr->base)=NULL;
@@ -602,6 +602,7 @@ struct listitem * stopforgc(struct garbagelist * ptr) {
   litem->tc_size=c_size;
   litem->tc_table=&c_table;
   litem->tc_list=&c_list;
+  litem->tc_structs=&c_structs;
   litem->objlist=newobjs;
   litem->base=&memorybase;
 #endif
index 597734edcbcb3c53f018b39048afff65a1824442..d402ab920b5bbed8a42c21c582d1020fbbb28929 100644 (file)
@@ -18,6 +18,7 @@ struct listitem {
 #endif
 #ifdef STM
   unsigned int tc_size;
+  cliststruct_t **tc_structs;
   chashlistnode_t **tc_table;
   chashlistnode_t **tc_list;
   struct objlist * objlist;
@@ -41,5 +42,5 @@ int gc_createcopy(void * orig, void **);
 void * mygcmalloc(struct garbagelist * ptr, int size);
 #endif
 #ifdef STM
-void fixtable(chashlistnode_t **, chashlistnode_t **, unsigned int);
+void fixtable(chashlistnode_t **, chashlistnode_t **, cliststruct_t **, unsigned int);
 #endif