STM testcase works...plenty of bugs still
authorbdemsky <bdemsky>
Tue, 7 Apr 2009 01:17:04 +0000 (01:17 +0000)
committerbdemsky <bdemsky>
Tue, 7 Apr 2009 01:17:04 +0000 (01:17 +0000)
Robust/src/IR/Flat/BuildCode.java
Robust/src/Runtime/STM/stm.c
Robust/src/Runtime/STM/tm.h
Robust/src/Runtime/runtime.c
Robust/src/Tests/STM.java

index e595193f292b73aae30eeeb7b71ea97cbe5dbf82..a377459cd4dd114dd2f1463a0036ba75f0dc71d5 100644 (file)
@@ -1803,7 +1803,11 @@ public class BuildCode {
       return;
     /* Have to generate flat globalconv */
     if (fgcn.getMakePtr()) {
-      output.println("TRANSREAD("+generateTemp(fm, fgcn.getSrc(),lb)+", (unsigned int) "+generateTemp(fm, fgcn.getSrc(),lb)+");");
+       if (state.DSM) {
+           output.println("TRANSREAD("+generateTemp(fm, fgcn.getSrc(),lb)+", (unsigned int) "+generateTemp(fm, fgcn.getSrc(),lb)+");");
+       } else {
+           output.println("TRANSREAD("+generateTemp(fm, fgcn.getSrc(),lb)+", "+generateTemp(fm, fgcn.getSrc(),lb)+");");
+       }
     } else {
       /* Need to convert to OID */
       if (fgcn.doConvert()) {
@@ -2105,8 +2109,8 @@ public class BuildCode {
       String dst=generateTemp(fm, ffn.getDst(),lb);
 
       output.println(dst+"="+ src +"->"+field+ ";");
-      if (ffn.getField().getType().isPtr()) {
-       output.println("TRANSREAD("+dst+", (unsigned int) "+dst+");");
+      if (ffn.getField().getType().isPtr()&&locality.getAtomic(lb).get(ffn).intValue()>0) {
+       output.println("TRANSREAD("+dst+", "+dst+");");
       }
     } else if (state.DSM) {
       Integer status=locality.getNodePreTempInfo(lb,ffn).get(ffn.getSrc());
@@ -2265,12 +2269,10 @@ public class BuildCode {
     if (state.SINGLETM) {
       //Single machine transaction case
       String dst=generateTemp(fm, fen.getDst(),lb);
-      
-      if (elementtype.isPtr()) {
-       output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
+      output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
+
+      if (elementtype.isPtr()&&locality.getAtomic(lb).get(fen).intValue()>0) {
        output.println("TRANSREAD("+dst+", "+dst+");");
-      } else {
-       output.println(dst +"=(("+ type+"*)(((char *) &("+ generateTemp(fm,fen.getSrc(),lb)+"->___length___))+sizeof(int)))["+generateTemp(fm, fen.getIndex(),lb)+"];");
       }
     } else if (state.DSM) {
       Integer status=locality.getNodePreTempInfo(lb,fen).get(fen.getSrc());
index 3bb57420472fadacab1668412eb4af1c52663516..f8b5ee007a4f64e5b4fb959762d33448b8c4704c 100644 (file)
@@ -72,9 +72,9 @@ void transStart() {
 objheader_t *transCreateObj(void * ptr, unsigned int size) {
   objheader_t *tmp = mygcmalloc(ptr, (sizeof(objheader_t) + size));
   objheader_t *retval=&tmp[1];
+  initdsmlocks(&tmp->lock);
   tmp->version = 1;
   t_chashInsert((unsigned int) retval, retval);
-
   return retval; //want space after object header
 }
 
@@ -86,7 +86,7 @@ void randomdelay() {
 
   t = time(NULL);
   req.tv_sec = 0;
-  req.tv_nsec = (long)(1000 + (t%10000)); //1-11 microsec
+  req.tv_nsec = (long)(t%100); //1-11 microsec
   nanosleep(&req, NULL);
   return;
 }
@@ -132,7 +132,7 @@ void *objstrAlloc(objstr_t **osptr, unsigned int size) {
  * -copies the object into the transaction cache
  * =============================================================
  */
-__attribute__((pure)) objheader_t *transRead(unsigned int oid) {
+__attribute__((pure)) void *transRead(void * oid) {
   unsigned int machinenumber;
   objheader_t *tmp, *objheader;
   objheader_t *objcopy;
@@ -140,17 +140,17 @@ __attribute__((pure)) objheader_t *transRead(unsigned int oid) {
 
   /* Read from the main heap */
   objheader_t *header = (objheader_t *)(((char *)oid) - sizeof(objheader_t)); 
-  if(read_trylock(STATUSPTR(header))) { //Can further acquire read locks
+  if(read_trylock(&header->lock)) { //Can further acquire read locks
     GETSIZE(size, header);
     size += sizeof(objheader_t);
     objcopy = (objheader_t *) objstrAlloc(&t_cache, size);
     memcpy(objcopy, header, size);
     /* Insert into cache's lookup table */
     STATUS(objcopy)=0;
-    t_chashInsert(OID(header), objcopy);
+    t_chashInsert((unsigned int)oid, &objcopy[1]);
+    read_unlock(&header->lock);
     return &objcopy[1];
   }
-  read_unlock(STATUSPTR(header));
 }
 
 /* ================================================================
@@ -161,46 +161,27 @@ __attribute__((pure)) objheader_t *transRead(unsigned int oid) {
  * ================================================================
  */
 int transCommit() {
-  int finalResponse;
-  char treplyretry; /* keeps track of the common response that needs to be sent */
-
   do {
-    treplyretry = 0;
     /* Look through all the objects in the transaction hash table */
-    finalResponse = traverseCache(&treplyretry);
+    int finalResponse = traverseCache();
     if(finalResponse == TRANS_ABORT) {
-      break;
+      objstrDelete(t_cache);
+      t_chashDelete();
+      return TRANS_ABORT;
     }
     if(finalResponse == TRANS_COMMIT) {
-      break;
+      objstrDelete(t_cache);
+      t_chashDelete();
+      return 0;
     }
     /* wait a random amount of time before retrying to commit transaction*/
-    if(treplyretry && (finalResponse == TRANS_SOFT_ABORT)) {
+    if(finalResponse == TRANS_SOFT_ABORT) {
       randomdelay();
-    }
-    if(finalResponse != TRANS_ABORT && finalResponse != TRANS_COMMIT && finalResponse != TRANS_SOFT_ABORT) {
+    } else {
       printf("Error: in %s() Unknown outcome", __func__);
       exit(-1);
     }
-    /* Retry trans commit procedure during soft_abort case */
-  } while (treplyretry);
-
-  if(finalResponse == TRANS_ABORT) {
-    /* Free Resources */
-    objstrDelete(t_cache);
-    t_chashDelete();
-    return TRANS_ABORT;
-  } else if(finalResponse == TRANS_COMMIT) {
-    /* Free Resources */
-    objstrDelete(t_cache);
-    t_chashDelete();
-    return 0;
-  } else {
-    //TODO Add other cases
-    printf("Error: in %s() THIS SHOULD NOT HAPPEN.....EXIT PROGRAM\n", __func__);
-    exit(-1);
-  }
-  return 0;
+  } while (1);
 }
 
 /* ==================================================
@@ -209,23 +190,13 @@ int transCommit() {
  * - decides if a transaction should commit or abort
  * ==================================================
  */
-int traverseCache(char *treplyretry) {
-  /* Create info for newly creately objects */
-  int numcreated=0;
-  unsigned int oidcreated[c_numelements];
+int traverseCache() {
   /* Create info to keep track of objects that can be locked */
   int numoidrdlocked=0;
   int numoidwrlocked=0;
   unsigned int oidrdlocked[c_numelements];
   unsigned int oidwrlocked[c_numelements];
-  /* Counters to decide final response of this transaction */
-  int vmatch_lock;
-  int vmatch_nolock;
-  int vnomatch;
-  int numoidread;
-  int numoidmod;
-  int response;
-
+  int softabort=0;
   int i;
   chashlistnode_t *ptr = c_table;
   /* Represents number of bins in the chash table */
@@ -237,29 +208,26 @@ int traverseCache(char *treplyretry) {
       //if the first bin in hash table is empty
       if(curr->key == 0)
         break;
-      objheader_t * headeraddr=(objheader_t *) curr->val;
-      response = decideResponse(headeraddr, oidcreated, &numcreated, oidrdlocked, &numoidrdlocked, oidwrlocked, &numoidwrlocked,
-                                &vmatch_lock, &vmatch_nolock, &vnomatch, &numoidmod, &numoidread);
+      objheader_t * headeraddr=&((objheader_t *) curr->val)[-1];
+      int response = decideResponse(headeraddr, oidrdlocked, &numoidrdlocked, oidwrlocked, &numoidwrlocked);
+
       if(response == TRANS_ABORT) {
-        *treplyretry = 0;
         transAbortProcess(oidrdlocked, &numoidrdlocked, oidwrlocked, &numoidwrlocked);
         return TRANS_ABORT;
+      } else if (response == TRANS_SOFT_ABORT) {
+       softabort=1;
       }
       curr = curr->next;
     }
   } //end of for
   
   /* Decide the final response */
-  if(vmatch_nolock == (numoidread + numoidmod)) {
-    *treplyretry = 0;
-    transCommitProcess(oidcreated, &numcreated, oidrdlocked, &numoidrdlocked, oidwrlocked, &numoidwrlocked);
-    response = TRANS_COMMIT;
-  }
-  if(vmatch_lock > 0 && vnomatch == 0) {
-    *treplyretry = 1;
-    response = TRANS_SOFT_ABORT;
+  if (softabort) {
+    return TRANS_SOFT_ABORT;
+  } else {
+    transCommitProcess(oidrdlocked, &numoidrdlocked, oidwrlocked, &numoidwrlocked);
+    return TRANS_COMMIT;
   }
-  return response;
 }
 
 /* ===========================================================================
@@ -268,57 +236,52 @@ int traverseCache(char *treplyretry) {
  * - updates the oids locked and oids newly created 
  * ===========================================================================
  */
-int decideResponse(objheader_t *headeraddr, unsigned int *oidcreated, int *numcreated, unsigned int* oidrdlocked, int *numoidrdlocked,
-    unsigned int*oidwrlocked, int *numoidwrlocked, int *vmatch_lock, int *vmatch_nolock, int *vnomatch, int *numoidmod, int *numoidread) {
-  unsigned short version = headeraddr->version;
+int decideResponse(objheader_t *headeraddr, unsigned int* oidrdlocked, int *numoidrdlocked, unsigned int*oidwrlocked, int *numoidwrlocked) {
+  unsigned int version = headeraddr->version;
   unsigned int oid = OID(headeraddr);
+  int nolock = 0;
+  
   if(STATUS(headeraddr) & NEW) {
-    oidcreated[(*numcreated)++] = OID(headeraddr);
   } else if(STATUS(headeraddr) & DIRTY) {
-    (*numoidmod)++;
     /* Read from the main heap  and compare versions */
-    objheader_t *header = (objheader_t *)(((char *)(&oid)) - sizeof(objheader_t)); 
-    if(write_trylock(STATUSPTR(header))) { //can aquire write lock
+    objheader_t *header = (objheader_t *)(((char *)(oid)) - sizeof(objheader_t)); 
+    if(write_trylock(&header->lock)) { //can aquire write lock
       if (version == header->version) {/* versions match */
         /* Keep track of objects locked */
-        (*vmatch_nolock)++;
         oidwrlocked[(*numoidwrlocked)++] = OID(header);
       } else { 
-        (*vnomatch)++;
         oidwrlocked[(*numoidwrlocked)++] = OID(header);
         return TRANS_ABORT;
       }
     } else { /* cannot aquire lock */
       if(version == header->version) /* versions match */
-        (*vmatch_lock)++;
+       nolock=1;
       else {
-        (*vnomatch)++;
         return TRANS_ABORT;
       }
     }
   } else {
-    (*numoidread)++;
     /* Read from the main heap  and compare versions */
-    objheader_t *header = (objheader_t *)(((char *)(&oid)) - sizeof(objheader_t)); 
-    if(read_trylock(STATUSPTR(header))) { //can further aquire read locks
+    objheader_t *header = (objheader_t *)(((char *)(oid)) - sizeof(objheader_t)); 
+    if(read_trylock(&header->lock)) { //can further aquire read locks
       if(version == header->version) {/* versions match */
-        (*vmatch_nolock)++;
         oidrdlocked[(*numoidrdlocked)++] = OID(header);
       } else {
-        (*vnomatch)++;
         oidrdlocked[(*numoidrdlocked)++] = OID(header);
         return TRANS_ABORT;
       }
     } else { /* cannot aquire lock */
       if(version == header->version)
-        (*vmatch_lock)++;
+       nolock=1;
       else {
-        (*vnomatch)++;
         return TRANS_ABORT;
       }
     }
   }
-  return 0;
+  if (nolock)
+    return TRANS_SOFT_ABORT;
+  else
+    return TRANS_COMMIT;
 }
 
 /* ==================================
@@ -332,21 +295,15 @@ int transAbortProcess(unsigned int *oidrdlocked, int *numoidrdlocked, unsigned i
   /* Release read locks */
   for(i=0; i< *numoidrdlocked; i++) {
     /* Read from the main heap */
-    if((header = (objheader_t *)(((char *)(&oidrdlocked[i])) - sizeof(objheader_t))) == NULL) {
-      printf("Error: %s() main heap returned NULL at %s, %d\n", __func__, __FILE__, __LINE__);
-      return 1;
-    }
-    read_unlock(STATUSPTR(header));
+    header = (objheader_t *)(((char *)(oidrdlocked[i])) - sizeof(objheader_t));
+    read_unlock(&header->lock);
   }
 
   /* Release write locks */
   for(i=0; i< *numoidwrlocked; i++) {
     /* Read from the main heap */
-    if((header = (objheader_t *)(((char *)(&oidwrlocked[i])) - sizeof(objheader_t))) == NULL) {
-      printf("Error: %s() main heap returned NULL at %s, %d\n", __func__, __FILE__, __LINE__);
-      return 1;
-    }
-    write_unlock(STATUSPTR(header));
+    header = (objheader_t *)(((char *)(oidwrlocked[i])) - sizeof(objheader_t));
+    write_unlock(&header->lock);
   }
 }
 
@@ -355,69 +312,37 @@ int transAbortProcess(unsigned int *oidrdlocked, int *numoidrdlocked, unsigned i
  *
  * =================================
  */
-int transCommitProcess(unsigned int *oidcreated, int *numoidcreated, unsigned int *oidrdlocked, int *numoidrdlocked,
+int transCommitProcess(unsigned int *oidrdlocked, int *numoidrdlocked,
                     unsigned int *oidwrlocked, int *numoidwrlocked) {
-  objheader_t *header, *tcptr;
+  objheader_t *header;
   void *ptrcreate;
-
   int i;
-  /* If object is newly created inside transaction then commit it */
-  for (i = 0; i < *numoidcreated; i++) {
-    if ((header = ((objheader_t *) t_chashSearch(oidcreated[i]))) == NULL) {
-      printf("Error: %s() chashSearch returned NULL for oid = %x at %s, %d\n", __func__, oidcreated[i], __FILE__, __LINE__);
-      return 1;
-    }
-    int tmpsize;
-    GETSIZE(tmpsize, header);
-    tmpsize += sizeof(objheader_t);
-    /* FIXME Is this correct? */
-#ifdef PRECISE_GC
-    ptrcreate = mygcmalloc((struct garbagelist *)header, tmpsize);
-#else
-    ptrcreate = FREEMALLOC(tmpsize);
-#endif
-    /* Initialize read and write locks */
-    initdsmlocks(STATUSPTR(header));
-    memcpy(ptrcreate, header, tmpsize);
-  }
 
   /* Copy from transaction cache -> main object store */
   for (i = 0; i < *numoidwrlocked; i++) {
     /* Read from the main heap */ 
-    if((header = (objheader_t *)(((char *)(&oidwrlocked[i])) - sizeof(objheader_t))) == NULL) {
-      printf("Error: %s() main heap returns NULL at %s, %d\n", __func__, __FILE__, __LINE__);
-      return 1;
-    }
-    if ((tcptr = ((objheader_t *) t_chashSearch(oidwrlocked[i]))) == NULL) {
-      printf("Error: %s() chashSearch returned NULL at %s, %d\n", __func__, __FILE__, __LINE__);
-      return 1;
-    }
+    header = (objheader_t *)(((char *)(oidwrlocked[i])) - sizeof(objheader_t));
     int tmpsize;
     GETSIZE(tmpsize, header);
-    char *tmptcptr = (char *) tcptr;
-    {
-      struct ___Object___ *dst=(struct ___Object___*)((char*)header+sizeof(objheader_t));
-      struct ___Object___ *src=(struct ___Object___*)((char*)tmptcptr+sizeof(objheader_t));
-      dst->___cachedCode___=src->___cachedCode___;
-      dst->___cachedHash___=src->___cachedHash___;
-
-      memcpy(&dst[1], &src[1], tmpsize-sizeof(struct ___Object___));
-    }
-
+    struct ___Object___ *dst=(struct ___Object___*)oidwrlocked[i];
+    struct ___Object___ *src=t_chashSearch(oidwrlocked[i]);
+    dst->___cachedCode___=src->___cachedCode___;
+    dst->___cachedHash___=src->___cachedHash___;
+    memcpy(&dst[1], &src[1], tmpsize-sizeof(struct ___Object___));
     header->version += 1;
   }
   
   /* Release read locks */
   for(i=0; i< *numoidrdlocked; i++) {
     /* Read from the main heap */
-    header = (objheader_t *)(((char *)(&oidrdlocked[i])) - sizeof(objheader_t)); 
-    read_unlock(STATUSPTR(header));
+    header = (objheader_t *)(((char *)(oidrdlocked[i])) - sizeof(objheader_t)); 
+    read_unlock(&header->lock);
   }
 
   /* Release write locks */
   for(i=0; i< *numoidwrlocked; i++) {
-    header = (objheader_t *)(((char *)(&oidwrlocked[i])) - sizeof(objheader_t)); 
-    write_unlock(STATUSPTR(header));
+    header = (objheader_t *)(((char *)(oidwrlocked[i])) - sizeof(objheader_t)); 
+    write_unlock(&header->lock);
   }
 
   return 0;
index ae866701f18bf92eaa6dc17f79b9749165b2e6f5..ad38145a931f3f66832c3e6aa617941aa1422eb5 100644 (file)
@@ -41,8 +41,8 @@
 #ifdef COMPILER
 #include "structdefs.h"
 typedef struct objheader {
-  threadlist_t *notifylist;
   unsigned int version;
+  unsigned int lock;
 } objheader_t;
 
 #define OID(x) \
@@ -91,9 +91,9 @@ if ((inputvalue=(unsigned int)y)==0) x=NULL;\
 else { \
 chashlistnode_t * cnodetmp=&c_table[(inputvalue&c_mask)>>1];   \
 do { \
-  if (cnodetmp->key==inputvalue) {x=(void *)&((objheader_t*)cnodetmp->val)[1];break;} \
+  if (cnodetmp->key==inputvalue) {x=(void *)cnodetmp->val;break;} \
 cnodetmp=cnodetmp->next;\
- if (cnodetmp==NULL) {x=(void *)transRead(inputvalue); asm volatile("":"=m"(c_table),"=m"(c_mask));break;} \
+ if (cnodetmp==NULL) {x=transRead((void *)inputvalue); asm volatile("":"=m"(c_table),"=m"(c_mask));break;} \
 } while(1);\
 }}
 
@@ -125,13 +125,12 @@ void transStart();
 objheader_t *transCreateObj(void * ptr, unsigned int size);
 unsigned int getNewOID(void);
 void *objstrAlloc(objstr_t **osptr, unsigned int size);
-__attribute__((pure)) objheader_t *transRead(unsigned int oid);
+__attribute__((pure)) void *transRead(void * oid);
 int transCommit();
-char traverseCache(char *treplyretry);
-char decideResponse(objheader_t *, unsigned int *, int *, unsigned int *, int *, unsigned int*, int *, 
-    int *, int *, int *, int*, int*);
+int traverseCache();
+int decideResponse(objheader_t *, unsigned int *, int *, unsigned int*, int *);
 int transAbortProcess(unsigned int *, int *, unsigned int *, int *);
-int transCommmitProcess(unsigned int *, int *, unsigned int *, int *, unsigned int *, int *);
+int transCommmitProcess(unsigned int *, int *, unsigned int *, int *);
 void randomdelay();
 
 #endif
index 1258c78107ffbebe7d382c5d05f5fe36a79253dd..895001edd68e1a7f66a2429bbf1c77c6634b8e99 100644 (file)
@@ -202,17 +202,18 @@ __attribute__((malloc)) struct ArrayObject * allocate_newarrayglobal(int type, i
 __attribute__((malloc)) void * allocate_newtrans(void * ptr, int type) {
   struct ___Object___ * v=(struct ___Object___ *) transCreateObj(ptr, classsize[type]);
   v->type=type;
+  v->___objlocation___=v;
   return v;
 }
 
 /* Array allocation function */
-
 __attribute__((malloc)) struct ArrayObject * allocate_newarraytrans(void * ptr, int type, int length) {
   struct ArrayObject * v=(struct ArrayObject *)transCreateObj(ptr, sizeof(struct ArrayObject)+length*classsize[type]);
   if (length<0) {
     printf("ERROR: negative array\n");
     return NULL;
   }
+  v->___objlocation___=(struct ___Object___*)v;
   v->type=type;
   v->___length___=length;
   return v;
@@ -220,7 +221,9 @@ __attribute__((malloc)) struct ArrayObject * allocate_newarraytrans(void * ptr,
 __attribute__((malloc)) void * allocate_new(void * ptr, int type) {
   objheader_t *tmp=mygcmalloc((struct garbagelist *) ptr, classsize[type]+sizeof(objheader_t));
   struct ___Object___ * v=(struct ___Object___ *) &tmp[1];
+  initdsmlocks(&tmp->lock);
   tmp->version = 1;
+  v->___objlocation___=v;
   v->type = type;
   return v;
 }
@@ -230,12 +233,14 @@ __attribute__((malloc)) void * allocate_new(void * ptr, int type) {
 __attribute__((malloc)) struct ArrayObject * allocate_newarray(void * ptr, int type, int length) {
   objheader_t *tmp=mygcmalloc((struct garbagelist *) ptr, sizeof(struct ArrayObject)+length*classsize[type]+sizeof(objheader_t));
   struct ArrayObject * v=(struct ArrayObject *) &tmp[1];
+  initdsmlocks(&tmp->lock);
   tmp->version=1;
   v->type=type;
   if (length<0) {
     printf("ERROR: negative array\n");
     return NULL;
   }
+  v->___objlocation___=(struct ___Object___ *)v;
   v->___length___=length;
   return v;
 }
index a77540711cf3cb5d35a80f335418fc005c373185..1a86b8e8cee50e29eaf422dbc3d75545822e4626 100644 (file)
@@ -17,9 +17,11 @@ public class STM extends Thread {
   
   public void run() {
     int i;
-    atomic {
-      i=x.a++;
-    }
+    //    for(int j=0;j<10;j++) {
+       atomic {
+           i=x.a++;
+       }
+       //    }
     System.out.println("Initial value:"+i);
   }
 }