changes to improve performance
authorbdemsky <bdemsky>
Tue, 14 Apr 2009 00:52:35 +0000 (00:52 +0000)
committerbdemsky <bdemsky>
Tue, 14 Apr 2009 00:52:35 +0000 (00:52 +0000)
Robust/src/Runtime/STM/stmlookup.c
Robust/src/Runtime/STM/stmlookup.h
Robust/src/Runtime/STM/tm.h
Robust/src/Runtime/garbage.c

index 26da7e5bf75d1519116e8ef7e8e30cbf1555084a..024e39de687ca226491efe3a08f53333bd2af39b 100644 (file)
@@ -8,6 +8,7 @@ __thread unsigned INTPTR c_mask;
 __thread unsigned int c_numelements;
 __thread unsigned int c_threshold;
 __thread double c_loadfactor;
+__thread cliststruct_t *c_structs;
 
 void t_chashCreate(unsigned int size, double loadfactor) {
   chashtable_t *ctable;
@@ -21,7 +22,8 @@ void t_chashCreate(unsigned int size, double loadfactor) {
   c_loadfactor = loadfactor;
   c_size = size;
   c_threshold=size*loadfactor;
-  c_mask = (size << 3)-1;
+  c_mask = (size << 4)-1;
+  c_structs=calloc(1, sizeof(cliststruct_t));
   c_numelements = 0; // Initial number of elements in the hash
   c_list=NULL;
 }
@@ -29,7 +31,8 @@ void t_chashCreate(unsigned int size, double loadfactor) {
 void t_chashreset() {
   chashlistnode_t *ptr = c_table;
   int i;
-  if (c_numelements<(c_size>>3)) {
+
+  if (c_numelements<(c_size>>4)) {
     chashlistnode_t *top=&ptr[c_size];
     chashlistnode_t *tmpptr=c_list;
     while(tmpptr!=NULL) {
@@ -38,22 +41,18 @@ void t_chashreset() {
        //zero in list
        tmpptr->key=0;
        tmpptr->next=NULL;
-      } else {
-       free(tmpptr);
       }
       tmpptr=next;
     }
   } else {
-    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;
-      }
-    }
     bzero(c_table, sizeof(chashlistnode_t)*c_size);
   }
+  while(c_structs->next!=NULL) {
+    cliststruct_t *next=c_structs->next;
+    free(c_structs);
+    c_structs=next;
+  }
+  c_structs->num = 0;
   c_numelements = 0;
   c_list=NULL;
 }
@@ -69,7 +68,7 @@ void t_chashInsert(void * key, void *val) {
     t_chashResize(newsize);
   }
 
-  ptr = &c_table[(((unsigned INTPTR)key)&c_mask)>>3];
+  ptr = &c_table[(((unsigned INTPTR)key)&c_mask)>>4];
   c_numelements++;
 
   if(ptr->key==0) {
@@ -78,7 +77,18 @@ void t_chashInsert(void * key, void *val) {
     ptr->lnext=c_list;
     c_list=ptr;
   } else { // Insert in the beginning of linked list
-    chashlistnode_t * node = calloc(1, sizeof(chashlistnode_t));
+    chashlistnode_t * node;
+    if (c_structs->num<NUMCLIST) {
+      node=&c_structs->array[c_structs->num];
+      c_structs->num++;
+    } else {
+      //get new list
+      cliststruct_t *tcl=calloc(1,sizeof(cliststruct_t));
+      tcl->next=c_structs;
+      c_structs=tcl;
+      node=&tcl->array[0];
+      tcl->num=1;
+    }
     node->key = key;
     node->val = val;
     node->next = ptr->next;
@@ -91,7 +101,7 @@ void t_chashInsert(void * key, void *val) {
 // Search for an address for a given oid
 INLINE void * t_chashSearch(void * key) {
   //REMOVE HASH FUNCTION CALL TO MAKE SURE IT IS INLINED HERE
-  chashlistnode_t *node = &c_table[(((unsigned INTPTR)key) & c_mask)>>3];
+  chashlistnode_t *node = &c_table[(((unsigned INTPTR)key) & c_mask)>>4];
 
   do {
     if(node->key == key) {
@@ -102,6 +112,7 @@ INLINE void * t_chashSearch(void * key) {
 
   return NULL;
 }
+
 unsigned int t_chashResize(unsigned int newsize) {
   chashlistnode_t *node, *ptr, *curr;    // curr and next keep track of the current and the next chashlistnodes in a linked list
   unsigned int oldsize;
@@ -121,7 +132,7 @@ unsigned int t_chashResize(unsigned int newsize) {
   c_table = node;          //Update the global hashtable upon resize()
   c_size = newsize;
   c_threshold = newsize * c_loadfactor;
-  mask=c_mask = (newsize << 3)-1;
+  mask=c_mask = (newsize << 4)-1;
 
   for(i = 0; i < oldsize; i++) {                        //Outer loop for each bin in hash table
     curr = &ptr[i];
@@ -133,18 +144,15 @@ unsigned int t_chashResize(unsigned int newsize) {
       if ((key=curr->key) == 0) {             //Exit inner loop if there the first element is 0
        break;                  //key = val =0 for element if not present within the hash table
       }
-      next = curr->next;
-      index = (((unsigned INTPTR)key) & mask) >>3;
+      index = (((unsigned INTPTR)key) & mask) >>4;
       tmp=&node[index];
+      next = curr->next;
       // Insert into the new table
       if(tmp->key == 0) {
-       tmp->key = curr->key;
+       tmp->key = key;
        tmp->val = curr->val;
        tmp->lnext=c_list;
        c_list=tmp;
-       if (!isfirst) {
-         free(curr);
-       }
       }/*
         NOTE:  Add this case if you change this...
         This case currently never happens because of the way things rehash....
@@ -174,17 +182,14 @@ unsigned int t_chashResize(unsigned int newsize) {
 //Delete the entire hash table
 void t_chashDelete() {
   int i;
-  chashlistnode_t *ptr = c_table;
-
-  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;
-    }
+  cliststruct_t *ptr=c_structs;
+  while(ptr!=NULL) {
+    cliststruct_t *next=ptr->next;
+    free(ptr);
+    ptr=next;
   }
-  free(ptr);
+  free(c_table);
   c_table=NULL;
+  c_structs=NULL;
   c_list=NULL;
 }
index 476716e177d46160018578a0cead7667aec13879..c6af2e597cf17fecc5bc11c63884408a2d7092ff 100644 (file)
@@ -34,6 +34,13 @@ typedef struct chashtable {
   double loadfactor;
 } chashtable_t;
 
+#define NUMCLIST 250
+typedef struct clist {
+  struct chashlistnode array[NUMCLIST];
+  int num;
+  struct clist *next;
+} cliststruct_t;
+
 
 void t_chashCreate(unsigned int size, double loadfactor);
 void t_chashInsert(void * key, void *val);
@@ -50,5 +57,6 @@ extern __thread unsigned INTPTR c_mask;
 extern __thread unsigned int c_numelements;
 extern __thread unsigned int c_threshold;
 extern __thread double c_loadfactor;
+extern __thread cliststruct_t *c_structs;
 
 #endif
index 6910348bfd77e86dee834647b5743e08fc7eb976..5f7015885a946fce2357073fa98d0a30b85e9a01 100644 (file)
@@ -89,7 +89,7 @@ typedef struct objheader {
   void * inputvalue;\
 if ((inputvalue=y)==NULL) x=NULL;\
 else { \
-chashlistnode_t * cnodetmp=&c_table[(((unsigned INTPTR)inputvalue)&c_mask)>>3];        \
+chashlistnode_t * cnodetmp=&c_table[(((unsigned INTPTR)inputvalue)&c_mask)>>4];        \
 do { \
   if (cnodetmp->key==inputvalue) {x=cnodetmp->val;break;} \
 cnodetmp=cnodetmp->next;\
index 3fadff449c8380a1c4f0d799bc6e197f7cb13e59..9c440563690d69607f8c87a32321fa44c33d241d 100644 (file)
@@ -148,7 +148,7 @@ void fixobjlist(struct objlist * ptr) {
 }
 
 void fixtable(chashlistnode_t ** tc_table, chashlistnode_t **tc_list, unsigned int tc_size) {
-  unsigned int mask=(tc_size<<3)-1;
+  unsigned int mask=(tc_size<<4)-1;
   chashlistnode_t *node=calloc(tc_size, sizeof(chashlistnode_t));
   chashlistnode_t *ptr=*tc_table;
   chashlistnode_t *curr;
@@ -200,7 +200,7 @@ void fixtable(chashlistnode_t ** tc_table, chashlistnode_t **tc_list, unsigned i
       }
 
       next = curr->next;
-      index = (((unsigned INTPTR)key) & mask) >>3;
+      index = (((unsigned INTPTR)key) & mask) >>4;
 
       curr->key=key;
       tmp=&node[index];
@@ -210,11 +210,19 @@ void fixtable(chashlistnode_t ** tc_table, chashlistnode_t **tc_list, unsigned i
        tmp->val = curr->val;
        tmp->lnext=newlist;
        newlist=tmp;
-       if (!isfirst) {
-         free(curr);
-       }
       } else if (isfirst) {
-       chashlistnode_t *newnode= calloc(1, sizeof(chashlistnode_t));
+       chashlistnode_t *newnode;
+       if (c_structs->num<NUMCLIST) {
+         newnode=&c_structs->array[c_structs->num];
+         c_structs->num++;
+       } else {
+         //get new list
+         cliststruct_t *tcl=calloc(1,sizeof(cliststruct_t));
+         tcl->next=c_structs;
+         c_structs=tcl;
+         newnode=&tcl->array[0];
+         tcl->num=1;
+       }
        newnode->key = curr->key;
        newnode->val = curr->val;
        newnode->next = tmp->next;