abort bug fixes
authorbdemsky <bdemsky>
Fri, 6 Feb 2009 10:10:21 +0000 (10:10 +0000)
committerbdemsky <bdemsky>
Fri, 6 Feb 2009 10:10:21 +0000 (10:10 +0000)
Robust/src/Runtime/DSTM/interface/abortreaders.c
Robust/src/Runtime/DSTM/interface/dstm.h
Robust/src/Runtime/DSTM/interface/trans.c

index 73e9033abf4eb3047228c6b6a8c93171ca1904bb..860655b5e3f61a1b9b833b3979ef4ab3e8b82374 100644 (file)
@@ -25,7 +25,7 @@ void addtransaction(unsigned int oid, struct transrecord * trans) {
       freelist=rl->next;
       memset(rl,0, sizeof(struct readerlist));
     }
-    chashInsert(rl, oid, rl);
+    chashInsert(aborttable, oid, rl);
   }
   while(rl->numreaders==READERSIZE) {
     if (rl->next!=NULL)
@@ -52,11 +52,14 @@ void removetransaction(unsigned int oidarray[], unsigned int numoids) {
   pthread_mutex_lock(&aborttablelock);
   for(i=0;i<numoids;i++) {
     unsigned int oid=oidarray[i];
-    struct readerlist *rl=chashRemove2(table, oid);
+    struct readerlist *rl=chashRemove2(aborttable, oid);
     struct readerlist *tmp;
+    if (rl==NULL)
+      continue;
     do {
-      count=rl->numreaders;
-      for(int j=0;count;j++) {
+      int count=rl->numreaders;
+      int j;
+      for(j=0;count;j++) {
        struct transrecord *trans=rl->array[j];
        if (trans!=NULL) {
          trans->abort=1;//It's okay to set our own abort flag...it is
@@ -81,15 +84,15 @@ void removethisreadtransaction(unsigned char* oidverread, unsigned int numoids,
     struct readerlist * rl=chashSearch(aborttable, oid);
     struct readerlist *first=rl;
     oidverread+=(sizeof(unsigned int)+sizeof(unsigned short));
-    while(1) {
+    while(rl!=NULL) {
       for(j=0;j<READERSIZE;j++) {
        if (rl->array[j]==trans) {
          rl->array[j]=NULL;
          if ((--rl->numreaders)==0) {
            if (first==rl) {
-             chashRemove2(table, oid);
+             chashRemove2(aborttable, oid);
              if (rl->next!=NULL) 
-               chashInsert(table, oid, rl->next);
+               chashInsert(aborttable, oid, rl->next);
              rl->next=freelist;
              freelist=rl;
            } else {
@@ -105,6 +108,7 @@ void removethisreadtransaction(unsigned char* oidverread, unsigned int numoids,
       rl=rl->next;
     }
   nextitem:
+    ;
   }
   pthread_mutex_unlock(&aborttablelock);
 }
@@ -122,15 +126,15 @@ void removetransactionhash(chashtable_t *table, struct transrecord *trans) {
        break;
       struct readerlist * rl=chashSearch(aborttable, oid);
       struct readerlist *first=rl;
-      while(1) {
+      while(rl!=NULL) {
        for(j=0;j<READERSIZE;j++) {
          if (rl->array[j]==trans) {
            rl->array[j]=NULL;
            if ((--rl->numreaders)==0) {
              if (first==rl) {
-               chashRemove2(table, oid);
+               chashRemove2(aborttable, oid);
                if (rl->next!=NULL) 
-                 chashInsert(table, oid, rl->next);
+                 chashInsert(aborttable, oid, rl->next);
                rl->next=freelist;
                freelist=rl;
              } else {
@@ -161,15 +165,15 @@ void removethistransaction(unsigned int oidarray[], unsigned int numoids, struct
     struct readerlist * rl=chashSearch(aborttable, oid);
     
     struct readerlist *first=rl;
-    while(1) {
+    while(rl!=NULL) {
       for(j=0;j<READERSIZE;j++) {
        if (rl->array[j]==trans) {
          rl->array[j]=NULL;
          if ((--rl->numreaders)==0) {
            if (first==rl) {
-             chashRemove2(table, oid);
+             chashRemove2(aborttable, oid);
              if (rl->next!=NULL) 
-               chashInsert(table, oid, rl->next);
+               chashInsert(aborttable, oid, rl->next);
              rl->next=freelist;
              freelist=rl;
            } else {
@@ -185,6 +189,7 @@ void removethistransaction(unsigned int oidarray[], unsigned int numoids, struct
       rl=rl->next;
     }
   nextitem:
+    ;
   }
   pthread_mutex_unlock(&aborttablelock);
 }
index 356e4490212cc06f1cf4af2e941c288d42a4660a..8a458dc585bce931cc289d8a0140438250f33072 100644 (file)
@@ -83,6 +83,9 @@
 #include <signal.h>
 #include "plookup.h"
 #include "dsmdebug.h"
+#ifdef ABORTREADERS
+#include <setjmp.h>
+#endif
 
 //bit designations for status field of objheader
 #define DIRTY 0x01
index 85564b8b05127ad1449518bbb7c49598ed723c7a..5c1249fac0e1406e3ad1792e35c7e591c4ba194a 100644 (file)
@@ -15,6 +15,9 @@
 #ifdef COMPILER
 #include "thread.h"
 #endif
+#ifdef ABORTREADERS
+#include "abortreaders.h"
+#endif
 
 #define NUM_THREADS 1
 #define PREFETCH_CACHE_SIZE 1048576 //1MB
@@ -194,6 +197,9 @@ int dstmStartup(const char * option) {
   printf("Trans stats is on\n");
   fflush(stdout);
 #endif
+#ifdef ABORTREADERS
+  initreaderlist();
+#endif
 
   //Initialize socket pool
   transReadSockPool = createSockPool(transReadSockPool, DEFAULTSOCKPOOLSIZE);
@@ -397,9 +403,9 @@ __attribute__((pure)) objheader_t *transRead(transrecord_t *record, unsigned int
   */
 
 #ifdef ABORTREADERS
-  if (trans->abort) {
+  if (record->abort) {
     //abort this transaction
-    longjmp(trans->aborttrans,1);
+    longjmp(record->aborttrans,1);
   } else
     addtransaction(oid,record);
 #endif
@@ -754,13 +760,13 @@ int transCommit(transrecord_t *record) {
          }
 #ifdef ABORTREADERS
          removetransaction(tosend[i].oidmod,tosend[i].f.nummod);
-         removethisreadtransaction(tosend[i].oidmod,tosend[i].f.numread, record);
+         removethisreadtransaction(tosend[i].objread, tosend[i].f.numread, record);
 #endif
        }
 #ifdef ABORTREADERS
        else if (!treplyretry) {
          removethistransaction(tosend[i].oidmod,tosend[i].f.nummod,record);
-         removethisreadtransaction(tosend[i].oidmod,tosend[i].f.numread,record);
+         removethisreadtransaction(tosend[i].objread,tosend[i].f.numread,record);
        }
 #endif
 #endif
@@ -771,10 +777,10 @@ int transCommit(transrecord_t *record) {
 #ifdef ABORTREADERS
        if(finalResponse == TRANS_COMMIT) {
          removetransaction(tosend[i].oidmod,tosend[i].f.nummod);
-         removethisreadtransaction(tosend[i].oidmod,tosend[i].f.numread, record);
+         removethisreadtransaction(tosend[i].objread,tosend[i].f.numread, record);
        } else if (!treplyretry) {
          removethistransaction(tosend[i].oidmod,tosend[i].f.nummod,record);
-         removethisreadtransaction(tosend[i].oidmod,tosend[i].f.numread,record);
+         removethisreadtransaction(tosend[i].objread,tosend[i].f.numread,record);
        }
 #endif
       }