avoid resizing...
authorbdemsky <bdemsky>
Mon, 13 Apr 2009 20:41:31 +0000 (20:41 +0000)
committerbdemsky <bdemsky>
Mon, 13 Apr 2009 20:41:31 +0000 (20:41 +0000)
Robust/src/Runtime/STM/stm.c
Robust/src/Runtime/STM/stmlookup.c
Robust/src/Runtime/STM/stmlookup.h
Robust/src/Runtime/STM/tm.h
Robust/src/Runtime/thread.c

index abdc0f7e146ffa69fabfc4cefce1c200f80bd27b..1c3a01476542bc79cc573db778679298defb88a6 100644 (file)
@@ -14,6 +14,7 @@
 #include "garbage.h"
 /* Thread transaction variables */
 __thread objstr_t *t_cache;
+__thread objstr_t *t_reserve;
 __thread struct objlist * newobjs;
 
 #ifdef TRANSSTATS
@@ -51,6 +52,16 @@ objstr_t *objstrCreate(unsigned int size) {
   return tmp;
 }
 
+void objstrReset() {
+  while(t_cache->next!=NULL) {
+    objstr_t *next=t_cache->next;
+    t_cache->next=t_reserve;
+    t_reserve=t_cache;
+    t_cache=next;
+  }
+  t_cache->top=t_cache+1;
+}
+
 //free entire list, starting at store
 void objstrDelete(objstr_t *store) {
   objstr_t *tmp;
@@ -69,8 +80,7 @@ void objstrDelete(objstr_t *store) {
  * =================================================
  */
 void transStart() {
-  t_cache = objstrCreate(1048576);
-  t_chashCreate(CHASH_SIZE, CLOADFACTOR);
+  //Transaction start is currently free...commit and aborting is not
 }
 
 /* =======================================================
@@ -115,15 +125,15 @@ void randomdelay() {
  * - allocate space in an object store
  * ==============================================
  */
-void *objstrAlloc(objstr_t **osptr, unsigned int size) {
+void *objstrAlloc(unsigned int size) {
   void *tmp;
   int i=0;
-  objstr_t *store=*osptr;
+  objstr_t *store=t_cache;
   if ((size&7)!=0) {
     size+=(8-(size&7));
   }
 
-  for(;i<3;i++) {
+  for(;i<2;i++) {
     if (OSFREE(store)>=size) {
       tmp=store->top;
       store->top +=size;
@@ -135,13 +145,26 @@ void *objstrAlloc(objstr_t **osptr, unsigned int size) {
 
   {
     unsigned int newsize=size>DEFAULT_OBJ_STORE_SIZE?size:DEFAULT_OBJ_STORE_SIZE;
+    objstr_t **otmp=&t_reserve;
+    objstr_t *ptr;
+    while((ptr=*otmp)!=NULL) {
+      if (ptr->size>=newsize) {
+       //remove from list
+       *otmp=ptr->next;
+       ptr->next=t_cache;
+       t_cache=ptr;
+       ptr->top=((char *)(&ptr[1]))+size;
+       return &ptr[1];
+      }
+    }
+    
     objstr_t *os=(objstr_t *)calloc(1,(sizeof(objstr_t) + newsize));
-    void *ptr=&os[1];
-    os->next=*osptr;
-    (*osptr)=os;
+    void *nptr=&os[1];
+    os->next=t_cache;
+    t_cache=os;
     os->size=newsize;
-    os->top=((char *)ptr)+size;
-    return ptr;
+    os->top=((char *)nptr)+size;
+    return nptr;
   }
 }
 
@@ -165,7 +188,7 @@ __attribute__((pure)) void *transRead(void * oid) {
   objheader_t *header = (objheader_t *)(((char *)oid) - sizeof(objheader_t)); 
   GETSIZE(size, header);
   size += sizeof(objheader_t);
-  objcopy = (objheader_t *) objstrAlloc(&t_cache, size);
+  objcopy = (objheader_t *) objstrAlloc(size);
   memcpy(objcopy, header, size);
   /* Insert into cache's lookup table */
   STATUS(objcopy)=0;
@@ -206,9 +229,8 @@ int transCommit() {
       }
 #endif
       freenewobjs();
-      objstrDelete(t_cache);
-      t_cache=NULL;
-      t_chashDelete();
+      objstrReset();
+      t_chashreset();
       return TRANS_ABORT;
     }
     if(finalResponse == TRANS_COMMIT) {
@@ -219,9 +241,8 @@ int transCommit() {
       }
 #endif
       freenewobjs();
-      objstrDelete(t_cache);
-      t_cache=NULL;
-      t_chashDelete();
+      objstrReset();
+      t_chashreset();
       return 0;
     }
     /* wait a random amount of time before retrying to commit transaction*/
index cc9a77e0ffa3ea9593c5c46e0d6af06b81a150e8..f9537c53f99d38ab4eed622843d1ccb2f394b3a5 100644 (file)
@@ -1,4 +1,5 @@
 #include "stmlookup.h"
+#include "strings.h"
 
 __thread chashlistnode_t *c_table;
 __thread unsigned int c_size;
@@ -23,6 +24,21 @@ void t_chashCreate(unsigned int size, double loadfactor) {
   c_numelements = 0; // Initial number of elements in the hash
 }
 
+void t_chashreset() {
+  chashlistnode_t *ptr = c_table;
+  int i;
+  for(i=0 ; i<c_size ; i++) {
+    chashlistnode_t * curr = ptr[i].next;
+    while(curr!=NULL) {
+      chashlistnode_t * next = curr->next;
+      free(curr);
+      curr=next;
+    }
+  }
+  c_numelements = 0;
+  bzero(c_table, sizeof(chashlistnode_t)*c_size);
+}
+
 chashtable_t *chashCreate(unsigned int size, double loadfactor) {
   chashtable_t *ctable;
   chashlistnode_t *nodes;
index 7189bcdd2738ecca0133367eff33d9b0f7a6b9a7..e75447483de6e223e8bfb9f6f165db3502f47036 100644 (file)
@@ -39,6 +39,7 @@ void t_chashInsert(void * key, void *val);
 void * t_chashSearch(void * key);
 unsigned int t_chashResize(unsigned int newsize);
 void t_chashDelete();
+void t_chashreset();
 
 /* Prototypes for hash*/
 chashtable_t *chashCreate(unsigned int size, double loadfactor);
index deee9282fa498351fa445ab58d84afd29246db18..3227d5112affe1fb46bf3047f22cf9b9278c37f5 100644 (file)
@@ -105,7 +105,6 @@ typedef struct objstr {
   unsigned int size;       //this many bytes are allocated after this header
   void *top;
   struct objstr *next;
-  struct objstr *prev;
 } objstr_t;
 
 #define MAXOBJLIST 512
@@ -116,6 +115,9 @@ struct objlist {
 };
 
 extern __thread struct objlist * newobjs;
+extern __thread objstr_t *t_cache;
+extern __thread objstr_t *t_reserve;
+
 
 #ifdef TRANSSTATS
 /***********************************
@@ -133,12 +135,13 @@ extern int nSoftAbortCommit;
  * ================================
  */
 int stmStartup();
+void objstrReset();
 void objstrDelete(objstr_t *store);
 objstr_t *objstrCreate(unsigned int size);
 void transStart();
 objheader_t *transCreateObj(void * ptr, unsigned int size);
 unsigned int getNewOID(void);
-void *objstrAlloc(objstr_t **osptr, unsigned int size);
+void *objstrAlloc(unsigned int size);
 __attribute__((pure)) void *transRead(void * oid);
 int transCommit();
 int traverseCache();
index 9bd7aa0f86a4862347387ac1dcdd52756b28d220..a7790dfc1c7b3863da77629773009d26f59512f6 100644 (file)
 #ifndef RAW
 #include <stdio.h>
 #endif
+#ifdef STM
+#include "tm.h"
+#endif
+
 int threadcount;
 pthread_mutex_t gclock;
 pthread_mutex_t gclistlock;
@@ -118,8 +122,14 @@ void initthread(struct ___Thread___ * ___this___) {
   ___Thread______staticStart____L___Thread___((struct ___Thread______staticStart____L___Thread____params *)p);
 #else
   newobjs=calloc(1, sizeof(struct objlist));
+  t_cache = objstrCreate(1048576);
+  t_reserve=NULL;
+  t_chashCreate(CHASH_SIZE, CLOADFACTOR);
  ___Thread____NN____staticStart____L___Thread___((struct ___Thread____NN____staticStart____L___Thread____params *)p);
-  free(newobjs);
+ objstrDelete(t_cache);
+ objstrDelete(t_reserve);
+ t_chashDelete();
+ free(newobjs);
 #endif
   ___this___=(struct ___Thread___ *) p[2];
 #else