really annoying bug fixed...my benchmarks run now
authorbdemsky <bdemsky>
Tue, 30 Jun 2009 19:32:36 +0000 (19:32 +0000)
committerbdemsky <bdemsky>
Tue, 30 Jun 2009 19:32:36 +0000 (19:32 +0000)
Robust/src/Runtime/STM/stm.c
Robust/src/Runtime/STM/stmlookup.c

index 44d1c7a69003dbd37c2830a09fc527baa7387089..ef5db71d28af06efb5be63ce1ad1ce700e2d069d 100644 (file)
@@ -498,6 +498,9 @@ int traverseCache() {
           
          }
        } else {
+#ifdef DELAYCOMP
+      //TODO: check to see if we already have lock
+#endif
          if(version == header->version) {
            /* versions match */
            softabort=1;
@@ -547,7 +550,11 @@ int traverseCache() {
       
       do {
        if(node->key == key) {
-         goto nextloop;
+         objheader_t * headeraddr=&((objheader_t *) node->val)[-1];      
+         if(STATUS(headeraddr) & DIRTY) {
+           goto nextloop;
+         } else
+           break;
        }
        node = node->next;
       } while(node != NULL);
@@ -583,7 +590,6 @@ int traverseCache() {
     unsigned int version=oidrdversion[i];
     if(header->lock>0) { //not write locked
       if(version != header->version) { /* versions do not match */
-       oidrdlocked[numoidrdlocked++] = header;
 #ifdef DELAYCOMP
        transAbortProcess(oidwrlocked, numoidwrtotal);
 #else
@@ -604,7 +610,6 @@ int traverseCache() {
       //couldn't get lock because we already have it
       //check if it is the right version number
       if (version!=header->version) {
-       oidrdlocked[numoidrdlocked++] = header;
        transAbortProcess(oidwrlocked, numoidwrtotal);
 #ifdef STMSTATS
        ABORTCOUNT(header);
@@ -782,7 +787,10 @@ int alttraverseCache() {
       
       do {
        if(node->key == key) {
-         goto nextloop;
+         objheader_t * headeraddr=&((objheader_t *) node->val)[-1];      
+         if(STATUS(headeraddr) & DIRTY) {
+           goto nextloop;
+         }
        }
        node = node->next;
       } while(node != NULL);
@@ -832,6 +840,9 @@ int alttraverseCache() {
        freearrays;
        return TRANS_ABORT;
       }
+#ifdef DELAYCOMP
+      //TODO: check to see if we already have lock
+#endif
     } else { /* cannot aquire lock */
       if(version == header->version) {
        softabort=1;
index ab961244519f5d515d7e13057cccf52294ea4e63..7c7afe33c229ca231db05bd0a44c4203a3f31b67 100644 (file)
@@ -200,6 +200,22 @@ void dc_t_chashDelete() {
   dc_c_structs=NULL;
   dc_c_list=NULL;
 }
+
+// Search for an address for a given oid
+INLINE void * dc_t_chashSearch(void * key) {
+  //REMOVE HASH FUNCTION CALL TO MAKE SURE IT IS INLINED HERE
+  chashlistnode_t *node = &dc_c_table[(((unsigned INTPTR)key) & dc_c_mask)>>4];
+  
+  do {
+    if(node->key == key) {
+      return node->val;
+    }
+    node = node->next;
+  } while(node != NULL);
+
+  return NULL;
+}
+
 #endif
 
 void t_chashCreate(unsigned int size, double loadfactor) {