Updated hashRCR and Queue_RCR to conform with new standards (i.e. storing both a...
authorstephey <stephey>
Sat, 19 Mar 2011 23:47:41 +0000 (23:47 +0000)
committerstephey <stephey>
Sat, 19 Mar 2011 23:47:41 +0000 (23:47 +0000)
Robust/src/Runtime/oooJava/Queue_RCR.c
Robust/src/Runtime/oooJava/Queue_RCR.h
Robust/src/Runtime/oooJava/hashRCR.c
Robust/src/Runtime/oooJava/hashRCR.h

index ae8f197cf3fcefd7aacdf0208a1d026c14a5c4d0..745861aca1bed49f2b12e6dba4eb6cc185dae68d 100644 (file)
@@ -7,39 +7,40 @@ __thread struct RCRQueue myRCRQueue;
 void resetRCRQueue() {
   myRCRQueue.head = 0;
   myRCRQueue.tail = 0;
+  myRCRQueue.length = 0;
 }
 
-//0 would mean sucess
+//0 would mean success
 //1 would mean fail
-//since if we reach SIZE, we will stop operation, it doesn't matter
-//that we overwrite the element in the queue
-int enqueueRCRQueue(void * ptr) {
-  unsigned int head=myRCRQueue.head+1;
-  if (head&SIZE)
-    head=0;
-
-  if (head==myRCRQueue.tail)
-    return 1;
-  
-  myRCRQueue.elements[head] = ptr;
-  myRCRQueue.head=head;
+int enqueueRCRQueue(void * ptr, int traverserState) {
+  if (myRCRQueue.length & SIZE)
+      return 1;
+
+  myRCRQueue.length++;
+  myRCRQueue.elements[myRCRQueue.head].object = ptr;
+  myRCRQueue.elements[myRCRQueue.head].traverserState = traverserState;
+  myRCRQueue.head++;
+
+  if (myRCRQueue.head&SIZE)
+    myRCRQueue.head=0;
+
+
   return 0;
 }
 
-void * dequeueRCRQueue() {
-  if(myRCRQueue.head==myRCRQueue.tail)
+RCRQueueEntry * dequeueRCRQueue() {
+  if(!myRCRQueue.length)
     return NULL;
-  unsigned int tail=myRCRQueue.tail;
-  void * ptr = myRCRQueue.elements[tail];
-  tail++;
-  if(tail & SIZE)
-    tail =  0;
-  myRCRQueue.tail=tail;
+
+  myRCRQueue.length--;
+  void * ptr = &myRCRQueue.elements[myRCRQueue.tail++];
+  if(myRCRQueue.tail & SIZE)
+    myRCRQueue.tail =  0;
   return ptr;
 }
 
 int isEmptyRCRQueue() {
-  return myRCRQueue.head=myRCRQueue.tail;
+  return !myRCRQueue.length;
 }
 
 
index 38806463a9437b97ffd44ea5d0248dc985eed27b..fa91cbcab9bc29b7dfc134b6f5c3044ca729792b 100644 (file)
@@ -5,21 +5,20 @@
 //SIZE is used as mask to check overflow
 #define SIZE 16384
 
-struct RCRQueue {
-  void * elements[SIZE];
-  unsigned int head;
-  unsigned int tail;
-};
-
-
 typedef struct RCRQueueEntry_t {
   void* object;
   int   traverserState;
 } RCRQueueEntry;
 
+struct RCRQueue {
+  RCRQueueEntry elements[SIZE];
+  unsigned int head;
+  unsigned int tail;
+  unsigned int length;
+};
 
-int enqueueRCRQueue(void * ptr);
-void * dequeueRCRQueue();
+int enqueueRCRQueue(void * ptr, int traverserState);
+RCRQueueEntry * dequeueRCRQueue();
 void resetRCRQueue();
 int isEmptyRCRQueue();
 int getSizeRCRQueue();
index f3d62d67387f27e2725611d81f659d848a25805e..fc4b98cb9dd7fbf95989815d7929f67965f1aa17 100644 (file)
-#include "hashRCR.h"
-#include <strings.h>
-#define likely(x) __builtin_expect((x),1)
-#define unlikely(x) __builtin_expect((x),0)
-
-//Smallest Object Size with 1 ptr is 32bytes on on 64-bit machine and 24bytes on 32-bit machine
-#ifdef BIT64
-#define SHIFTBITS 5
-#else
-#define SHIFTBITS 4
-#endif
-
-__thread dchashlistnode_t *dc_c_table = NULL;
-__thread dchashlistnode_t *dc_c_list = NULL;
-__thread dcliststruct_t *dc_c_structs= NULL;
-__thread unsigned int dc_c_size;
-__thread unsigned INTPTR dc_c_mask;
-__thread unsigned int dc_c_numelements;
-__thread unsigned int dc_c_threshold;
-__thread double dc_c_loadfactor;
-
-void hashRCRCreate(unsigned int size, double loadfactor) {
-  // Allocate space for the hash table
-
-  dc_c_table = calloc(size, sizeof(dchashlistnode_t));
-  dc_c_loadfactor = loadfactor;
-  dc_c_size = size;
-  dc_c_threshold=size*loadfactor;
-  dc_c_mask = (size << SHIFTBITS)-1;
-  dc_c_structs=calloc(1, sizeof(dcliststruct_t));
-  dc_c_numelements = 0; // Initial number of elements in the hash
-  dc_c_list=NULL;
-}
-
-void hashRCRreset() {
-  if(dc_c_table == NULL) {
-    hashRCRCreate(128, 0.75);
-  }
-
-  dchashlistnode_t *ptr = dc_c_table;
-
-  if (dc_c_numelements<(dc_c_size>>SHIFTBITS)) {
-    dchashlistnode_t *top=&ptr[dc_c_size];
-    dchashlistnode_t *tmpptr=dc_c_list;
-    while(tmpptr!=NULL) {
-      dchashlistnode_t *next=tmpptr->lnext;
-      if (tmpptr>=ptr&&tmpptr<top) {
-       //zero in list
-       tmpptr->key=NULL;
-       tmpptr->next=NULL;
-      }
-      tmpptr=next;
-    }
-  } else {
-    bzero(dc_c_table, sizeof(dchashlistnode_t)*dc_c_size);
-  }
-  while(dc_c_structs->next!=NULL) {
-    dcliststruct_t *next=dc_c_structs->next;
-    free(dc_c_structs);
-    dc_c_structs=next;
-  }
-  dc_c_structs->num = 0;
-  dc_c_numelements = 0;
-  dc_c_list=NULL;
-}
-
-//Store objects and their pointers into hash
-//1 = add success
-//0 = object already exists / Add failed
-int hashRCRInsert(void * key) {
-  dchashlistnode_t *ptr;
-
-  if (unlikely(key==NULL)) {
-    return 0;
-  }
-
-  if(unlikely(dc_c_numelements > dc_c_threshold)) {
-    //Resize
-    unsigned int newsize = dc_c_size << 1;
-    hashRCRResize(newsize);
-  }
-  ptr = &dc_c_table[(((unsigned INTPTR)key)&dc_c_mask)>>SHIFTBITS];
-  if(likely(ptr->key==0)) {
-    ptr->key=key;
-    ptr->lnext=dc_c_list;
-    dc_c_list=ptr;
-    dc_c_numelements++;
-  } else { // Insert in the beginning of linked list
-    dchashlistnode_t * node;
-    dchashlistnode_t *search=ptr;
-    
-    //make sure it isn't here
-    do {
-      if(search->key == key) {
-       return 0;
-      }
-      search=search->next;
-    } while(search != NULL);
-
-    dc_c_numelements++;    
-    if (dc_c_structs->num<NUMDCLIST) {
-      node=&dc_c_structs->array[dc_c_structs->num];
-      dc_c_structs->num++;
-    } else {
-      //get new list
-      dcliststruct_t *tcl=calloc(1,sizeof(dcliststruct_t));
-      tcl->next=dc_c_structs;
-      dc_c_structs=tcl;
-      node=&tcl->array[0];
-      tcl->num=1;
-    }
-    node->key = key;
-    node->next = ptr->next;
-    ptr->next=node;
-    node->lnext=dc_c_list;
-    dc_c_list=node;
-  }
-
-  return 1;
-}
-
-
-unsigned int hashRCRResize(unsigned int newsize) {
-  dchashlistnode_t *node, *ptr, *curr;    // curr and next keep track of the current and the next chashlistnodes in a linked list
-  unsigned int oldsize;
-  int isfirst;    // Keeps track of the first element in the chashlistnode_t for each bin in hashtable
-  unsigned int i,index;
-  unsigned int mask;
-
-  ptr = dc_c_table;
-  oldsize = dc_c_size;
-  dc_c_list=NULL;
-
-  if((node = calloc(newsize, sizeof(dchashlistnode_t))) == NULL) {
-    printf("Calloc error %s %d\n", __FILE__, __LINE__);
-    return 1;
-  }
-
-  dc_c_table = node;          //Update the global hashtable upon resize()
-  dc_c_size = newsize;
-  dc_c_threshold = newsize * dc_c_loadfactor;
-  mask=dc_c_mask = (newsize << SHIFTBITS)-1;
-
-  for(i = 0; i < oldsize; i++) {                        //Outer loop for each bin in hash table
-    curr = &ptr[i];
-    isfirst = 1;
-    do {                      //Inner loop to go through linked lists
-      void * key;
-      dchashlistnode_t *tmp,*next;
-
-      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
-      }
-
-      index = (((unsigned INTPTR)key) & mask) >>SHIFTBITS;
-      tmp=&node[index];
-      next = curr->next;
-      // Insert into the new table
-      if(tmp->key == 0) {
-       tmp->key = key;
-       tmp->lnext=dc_c_list;
-       dc_c_list=tmp;
-      } /*
-          NOTE:  Add this case if you change this...
-          This case currently never happens because of the way things rehash....
-          else if (isfirst) {
-          chashlistnode_t *newnode= calloc(1, sizeof(chashlistnode_t));
-          newnode->key = curr->key;
-          newnode->val = curr->val;
-          newnode->next = tmp->next;
-          tmp->next=newnode;
-          } */
-      else {
-       curr->next=tmp->next;
-       tmp->next=curr;
-       curr->lnext=dc_c_list;
-       dc_c_list=curr;
-      }
-
-      isfirst = 0;
-      curr = next;
-    } while(curr!=NULL);
-  }
-
-  free(ptr);            //Free the memory of the old hash table
-  return 0;
-}
-
-//Delete the entire hash table
-void hashRCRDelete() {
-  dcliststruct_t *ptr=dc_c_structs;
-  while(ptr!=NULL) {
-    dcliststruct_t *next=ptr->next;
-    free(ptr);
-    ptr=next;
-  }
-  free(dc_c_table);
-  dc_c_table=NULL;
-  dc_c_structs=NULL;
-  dc_c_list=NULL;
-}
-
-// Search for an address for a given Address
-INLINE int hashRCRSearch(void * key) {
-  //REMOVE HASH FUNCTION CALL TO MAKE SURE IT IS INLINED HERE
-  dchashlistnode_t *node = &dc_c_table[(((unsigned INTPTR)key) & dc_c_mask)>>SHIFTBITS];
-  
-  do {
-    if(node->key == key) {
-      return 1;
-    }
-    node = node->next;
-  } while(node != NULL);
-
-  return 0;
-}
+#include "hashRCR.h"\r
+#include <strings.h>\r
+#define likely(x) __builtin_expect((x),1)\r
+#define unlikely(x) __builtin_expect((x),0)\r
+\r
+//Smallest Object Size with 1 ptr is 32bytes on on 64-bit machine and 24bytes on 32-bit machine\r
+#ifdef BIT64\r
+#define SHIFTBITS 5\r
+#else\r
+#define SHIFTBITS 4\r
+#endif\r
+\r
+__thread dchashlistnode_t *dc_c_table = NULL;\r
+__thread dchashlistnode_t *dc_c_list = NULL;\r
+__thread dcliststruct_t *dc_c_structs= NULL;\r
+__thread unsigned int dc_c_size;\r
+__thread unsigned INTPTR dc_c_mask;\r
+__thread unsigned int dc_c_numelements;\r
+__thread unsigned int dc_c_threshold;\r
+__thread double dc_c_loadfactor;\r
+\r
+void hashRCRCreate(unsigned int size, double loadfactor) {\r
+  // Allocate space for the hash table\r
+\r
+  dc_c_table = calloc(size, sizeof(dchashlistnode_t));\r
+  dc_c_loadfactor = loadfactor;\r
+  dc_c_size = size;\r
+  dc_c_threshold=size*loadfactor;\r
+  dc_c_mask = (size << SHIFTBITS)-1;\r
+  dc_c_structs=calloc(1, sizeof(dcliststruct_t));\r
+  dc_c_numelements = 0; // Initial number of elements in the hash\r
+  dc_c_list=NULL;\r
+}\r
+\r
+void hashRCRreset() {\r
+  if(dc_c_table == NULL) {\r
+    hashRCRCreate(128, 0.75);\r
+  }\r
+\r
+  dchashlistnode_t *ptr = dc_c_table;\r
+\r
+  if (dc_c_numelements<(dc_c_size>>SHIFTBITS)) {\r
+    dchashlistnode_t *top=&ptr[dc_c_size];\r
+    dchashlistnode_t *tmpptr=dc_c_list;\r
+    while(tmpptr!=NULL) {\r
+      dchashlistnode_t *next=tmpptr->lnext;\r
+      if (tmpptr>=ptr&&tmpptr<top) {\r
+       //zero in list\r
+       tmpptr->object=NULL;\r
+       tmpptr->next=NULL;\r
+      }\r
+      tmpptr=next;\r
+    }\r
+  } else {\r
+    bzero(dc_c_table, sizeof(dchashlistnode_t)*dc_c_size);\r
+  }\r
+  while(dc_c_structs->next!=NULL) {\r
+    dcliststruct_t *next=dc_c_structs->next;\r
+    free(dc_c_structs);\r
+    dc_c_structs=next;\r
+  }\r
+  dc_c_structs->num = 0;\r
+  dc_c_numelements = 0;\r
+  dc_c_list=NULL;\r
+}\r
+\r
+//Store objects and their pointers into hash\r
+//1 = add success\r
+//0 = object already exists / Add failed\r
+int hashRCRInsert(void * objectPtr, int traverserState) {\r
+  dchashlistnode_t *ptr;\r
+\r
+  if (unlikely(objectPtr==NULL)) {\r
+    return 0;\r
+  }\r
+\r
+  if(unlikely(dc_c_numelements > dc_c_threshold)) {\r
+    //Resize\r
+    unsigned int newsize = dc_c_size << 1;\r
+    hashRCRResize(newsize);\r
+  }\r
+  ptr = &dc_c_table[(((unsigned INTPTR)objectPtr)&dc_c_mask)>>SHIFTBITS];\r
+  if(likely(ptr->object==0)) {\r
+    ptr->object=objectPtr;\r
+    ptr->traverserState = traverserState;\r
+    ptr->lnext=dc_c_list;\r
+    dc_c_list=ptr;\r
+    dc_c_numelements++;\r
+  } else { // Insert in the beginning of linked list\r
+    dchashlistnode_t * node;\r
+    dchashlistnode_t *search=ptr;\r
+    \r
+    //make sure it isn't here\r
+    do {\r
+      if(search->object == objectPtr && search->traverserState == traverserState) {\r
+        return 0;\r
+      }\r
+      search=search->next;\r
+    } while(search != NULL);\r
+\r
+    dc_c_numelements++;    \r
+    if (dc_c_structs->num<NUMDCLIST) {\r
+      node=&dc_c_structs->array[dc_c_structs->num];\r
+      dc_c_structs->num++;\r
+    } else {\r
+      //get new list\r
+      dcliststruct_t *tcl=calloc(1,sizeof(dcliststruct_t));\r
+      tcl->next=dc_c_structs;\r
+      dc_c_structs=tcl;\r
+      node=&tcl->array[0];\r
+      tcl->num=1;\r
+    }\r
+    node->object = objectPtr;\r
+    node->traverserState=traverserState;\r
+    node->next = ptr->next;\r
+    ptr->next=node;\r
+    node->lnext=dc_c_list;\r
+    dc_c_list=node;\r
+  }\r
+\r
+  return 1;\r
+}\r
+\r
+\r
+unsigned int hashRCRResize(unsigned int newsize) {\r
+  dchashlistnode_t *node, *ptr, *curr;    // curr and next keep track of the current and the next chashlistnodes in a linked list\r
+  unsigned int oldsize;\r
+  int isfirst;    // Keeps track of the first element in the chashlistnode_t for each bin in hashtable\r
+  unsigned int i,index;\r
+  unsigned int mask;\r
+\r
+  ptr = dc_c_table;\r
+  oldsize = dc_c_size;\r
+  dc_c_list=NULL;\r
+\r
+  if((node = calloc(newsize, sizeof(dchashlistnode_t))) == NULL) {\r
+    printf("Calloc error %s %d\n", __FILE__, __LINE__);\r
+    return 1;\r
+  }\r
+\r
+  dc_c_table = node;          //Update the global hashtable upon resize()\r
+  dc_c_size = newsize;\r
+  dc_c_threshold = newsize * dc_c_loadfactor;\r
+  mask=dc_c_mask = (newsize << SHIFTBITS)-1;\r
+\r
+  for(i = 0; i < oldsize; i++) {                        //Outer loop for each bin in hash table\r
+    curr = &ptr[i];\r
+    isfirst = 1;\r
+    do {                      //Inner loop to go through linked lists\r
+      void * key;\r
+      dchashlistnode_t *tmp,*next;\r
+\r
+      if ((key=curr->object) == 0) {             //Exit inner loop if there the first element is 0\r
+       break;                  //key = val =0 for element if not present within the hash table\r
+      }\r
+\r
+      index = (((unsigned INTPTR)key) & mask) >>SHIFTBITS;\r
+      tmp=&node[index];\r
+      next = curr->next;\r
+      // Insert into the new table\r
+      if(tmp->object == 0) {\r
+        tmp->object = key;\r
+        tmp->traverserState = curr->traverserState;\r
+        tmp->lnext=dc_c_list;\r
+        dc_c_list=tmp;\r
+      } /*\r
+          NOTE:  Add this case if you change this...\r
+          This case currently never happens because of the way things rehash....\r
+          else if (isfirst) {\r
+          chashlistnode_t *newnode= calloc(1, sizeof(chashlistnode_t));\r
+          newnode->key = curr->key;\r
+          newnode->val = curr->val;\r
+          newnode->next = tmp->next;\r
+          tmp->next=newnode;\r
+          } */\r
+      else {\r
+        curr->next=tmp->next;\r
+        tmp->next=curr;\r
+        curr->lnext=dc_c_list;\r
+        dc_c_list=curr;\r
+      }\r
+\r
+      isfirst = 0;\r
+      curr = next;\r
+    } while(curr!=NULL);\r
+  }\r
+\r
+  free(ptr);            //Free the memory of the old hash table\r
+  return 0;\r
+}\r
+\r
+//Delete the entire hash table\r
+void hashRCRDelete() {\r
+  dcliststruct_t *ptr=dc_c_structs;\r
+  while(ptr!=NULL) {\r
+    dcliststruct_t *next=ptr->next;\r
+    free(ptr);\r
+    ptr=next;\r
+  }\r
+  free(dc_c_table);\r
+  dc_c_table=NULL;\r
+  dc_c_structs=NULL;\r
+  dc_c_list=NULL;\r
+}\r
+\r
+// Search for an address for a given Address\r
+INLINE int hashRCRSearch(void * objectPtr, int traverserState) {\r
+  //REMOVE HASH FUNCTION CALL TO MAKE SURE IT IS INLINED HERE\r
+  dchashlistnode_t *node = &dc_c_table[(((unsigned INTPTR)objectPtr) & dc_c_mask)>>SHIFTBITS];\r
+  \r
+  do {\r
+    if(node->object == objectPtr && node->traverserState == traverserState) {\r
+      return 1;\r
+    }\r
+    node = node->next;\r
+  } while(node != NULL);\r
+\r
+  return 0;\r
+}\r
index 646e62961d20f14614e75b0702376c6ce4328184..cab493b071f56713fa9ebcda09294c58606267e4 100644 (file)
@@ -1,48 +1,43 @@
-#ifndef _HASHRCR_H_
-#define _HASHRCR_H_
-
-#include <stdlib.h>
-#include <stdio.h>
-
-#ifndef INTPTR
-#ifdef BIT64
-#define INTPTR long
-#else
-#define INTPTR int
-#endif
-#endif
-
-//TODO consider changing loadfactor?
-#define CLOADFACTOR 0.25
-#define CHASH_SIZE 1024
-
-#define INLINE    inline __attribute__((always_inline))
-
-//TODO consider changing names to avoid conflicts
-extern __thread unsigned int dc_c_size;
-extern __thread unsigned INTPTR dc_c_mask;
-extern __thread unsigned int dc_c_numelements;
-extern __thread unsigned int dc_c_threshold;
-extern __thread double dc_c_loadfactor;
-
-typedef struct dchashlistnode {
-  void * key;
-  struct dchashlistnode *next;
-  struct dchashlistnode *lnext;
-} dchashlistnode_t;
-
-#define NUMDCLIST 250
-typedef struct dclist {
-  struct dchashlistnode array[NUMDCLIST];
-  int num;
-  struct dclist *next;
-} dcliststruct_t;
-
-
-void hashRCRCreate(unsigned int size, double loadfactor);
-int hashRCRInsert(void * key);
-int hashRCRSearch(void * key);
-unsigned int hashRCRResize(unsigned int newsize);
-void hashRCRDelete();
-void hashRCRreset();
-#endif
+#ifndef _HASHRCR_H_\r
+#define _HASHRCR_H_\r
+\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
+\r
+#ifndef INTPTR\r
+#ifdef BIT64\r
+#define INTPTR long\r
+#else\r
+#define INTPTR int\r
+#endif\r
+#endif\r
+\r
+#define INLINE    inline __attribute__((always_inline))\r
+\r
+extern __thread unsigned int dc_c_size;\r
+extern __thread unsigned INTPTR dc_c_mask;\r
+extern __thread unsigned int dc_c_numelements;\r
+extern __thread unsigned int dc_c_threshold;\r
+extern __thread double dc_c_loadfactor;\r
+\r
+typedef struct dchashlistnode {\r
+  void * object;\r
+  int traverserState;\r
+  struct dchashlistnode *next;\r
+  struct dchashlistnode *lnext;\r
+} dchashlistnode_t;\r
+\r
+#define NUMDCLIST 250\r
+typedef struct dclist {\r
+  struct dchashlistnode array[NUMDCLIST];\r
+  int num;\r
+  struct dclist *next;\r
+} dcliststruct_t;\r
+\r
+\r
+void hashRCRCreate(unsigned int size, double loadfactor);\r
+INLINE int hashRCRSearch(void * objectPtr, int traverserState);\r
+unsigned int hashRCRResize(unsigned int newsize);\r
+void hashRCRDelete();\r
+void hashRCRreset();\r
+#endif\r