*** empty log message ***
[IRC.git] / Robust / src / Runtime / GenericHashtable.c
index 422d03c5c5e8be33ac0b2759d8e0488bba8c80b7..f8255f3992009789b51633f0bd435fa0b17baad2 100755 (executable)
@@ -1,7 +1,9 @@
 #include <stdio.h>
 #include <sys/types.h>
+#ifndef MULTICORE
 #include <sys/stat.h>
 #include <fcntl.h>
+#endif
 #include <stdlib.h>
 #include <limits.h>
 
@@ -12,6 +14,9 @@
 #endif
 
 void * getfirstkey(struct genhashtable *ht) {
+  if(ht->list == NULL) {
+    return NULL;
+  }
   return ht->list->src;
 }
 
@@ -36,21 +41,66 @@ int genputtable(struct genhashtable *ht, void * key, void * object) {
   ht->counter++;
   if(ht->counter>ht->currentsize&&ht->currentsize!=INT_MAX) {
     /* Expand hashtable */
-    long newcurrentsize=(ht->currentsize<(INT_MAX/2))?ht->currentsize*2:INT_MAX;
+    long newcurrentsize=(ht->currentsize<(INT_MAX/2)) ? ht->currentsize*2 : INT_MAX;
     long oldcurrentsize=ht->currentsize;
     struct genpointerlist **newbins=(struct genpointerlist **) RUNMALLOC(sizeof (struct genpointerlist *)*newcurrentsize);
     struct genpointerlist **oldbins=ht->bins;
     long j,i;
-    for(j=0;j<newcurrentsize;j++) newbins[j]=NULL;
+    for(j=0; j<newcurrentsize; j++) newbins[j]=NULL;
+    ht->currentsize=newcurrentsize;
+    for(i=0; i<oldcurrentsize; i++) {
+      struct genpointerlist * tmpptr=oldbins[i];
+      while(tmpptr!=NULL) {
+       unsigned int hashcode=genhashfunction(ht, tmpptr->src);
+       struct genpointerlist *nextptr=tmpptr->next;
+       tmpptr->next=newbins[hashcode];
+       newbins[hashcode]=tmpptr;
+       tmpptr=nextptr;
+      }
+    }
+    ht->bins=newbins;
+    RUNFREE(oldbins);
+  }
+  return 1;
+}
+
+#ifdef MULTICORE
+int genputtable_I(struct genhashtable *ht, void * key, void * object) {
+  unsigned int bin=genhashfunction(ht,key);
+  struct genpointerlist * newptrlist=(struct genpointerlist *) RUNMALLOC_I(sizeof(struct genpointerlist));
+  newptrlist->src=key;
+  newptrlist->object=object;
+  newptrlist->next=ht->bins[bin];
+  newptrlist->inext=NULL;
+  /* maintain linked list of ht entries for iteration*/
+  if (ht->last==NULL) {
+    ht->last=newptrlist;
+    ht->list=newptrlist;
+    newptrlist->iprev=NULL;
+  } else {
+    ht->last->inext=newptrlist;
+    newptrlist->iprev=ht->last;
+    ht->last=newptrlist;
+  }
+  ht->bins[bin]=newptrlist;
+  ht->counter++;
+  if(ht->counter>ht->currentsize&&ht->currentsize!=INT_MAX) {
+    /* Expand hashtable */
+    long newcurrentsize=(ht->currentsize<(INT_MAX/2)) ? ht->currentsize*2 : INT_MAX;
+    long oldcurrentsize=ht->currentsize;
+    struct genpointerlist **newbins=(struct genpointerlist **) RUNMALLOC_I(sizeof (struct genpointerlist *)*newcurrentsize);
+    struct genpointerlist **oldbins=ht->bins;
+    long j,i;
+    for(j=0; j<newcurrentsize; j++) newbins[j]=NULL;
     ht->currentsize=newcurrentsize;
-    for(i=0;i<oldcurrentsize;i++) {
+    for(i=0; i<oldcurrentsize; i++) {
       struct genpointerlist * tmpptr=oldbins[i];
       while(tmpptr!=NULL) {
-        unsigned int hashcode=genhashfunction(ht, tmpptr->src);
-        struct genpointerlist *nextptr=tmpptr->next;
-        tmpptr->next=newbins[hashcode];
-        newbins[hashcode]=tmpptr;
-        tmpptr=nextptr;
+       unsigned int hashcode=genhashfunction(ht, tmpptr->src);
+       struct genpointerlist *nextptr=tmpptr->next;
+       tmpptr->next=newbins[hashcode];
+       newbins[hashcode]=tmpptr;
+       tmpptr=nextptr;
       }
     }
     ht->bins=newbins;
@@ -58,6 +108,7 @@ int genputtable(struct genhashtable *ht, void * key, void * object) {
   }
   return 1;
 }
+#endif
 
 int hashsize(struct genhashtable *ht) {
   return ht->counter;
@@ -66,9 +117,9 @@ int hashsize(struct genhashtable *ht) {
 void genrehash(struct genhashtable * ht) {
   struct genpointerlist **newbins=(struct genpointerlist **) RUNMALLOC(sizeof (struct genpointerlist *)*ht->currentsize);
   struct genpointerlist **oldbins=ht->bins;
-  long j,i;
+  long i;
 
-  for(i=0;i<ht->currentsize;i++) {
+  for(i=0; i<ht->currentsize; i++) {
     struct genpointerlist * tmpptr=oldbins[i];
     while(tmpptr!=NULL) {
       unsigned int hashcode=genhashfunction(ht, tmpptr->src);
@@ -89,7 +140,9 @@ void * gengettable(struct genhashtable *ht, void * key) {
       return ptr->object;
     ptr=ptr->next;
   }
+#ifndef MULTICORE
   printf("XXXXXXXXX: COULDN'T FIND ENTRY FOR KEY %p\n",key);
+#endif
   return NULL;
 }
 
@@ -103,7 +156,9 @@ void * getnext(struct genhashtable *ht, void * key) {
        return NULL;
     ptr=ptr->next;
   }
+#ifndef MULTICORE
   printf("XXXXXXXXX: COULDN'T FIND ENTRY FOR KEY %p...\n Likely concurrent removal--bad user!!!\n",key);
+#endif
   return NULL;
 }
 
@@ -121,7 +176,7 @@ int gencontains(struct genhashtable *ht, void * key) {
 
 void genfreekey(struct genhashtable *ht, void * key) {
   struct genpointerlist * ptr=ht->bins[genhashfunction(ht,key)];
-  if(ptr==NULL) printf("otr is null\n");
+
   if (((ht->comp_function==NULL)&&(ptr->src==key))||((ht->comp_function!=NULL)&&(*ht->comp_function)(ptr->src,key))) {
     ht->bins[genhashfunction(ht,key)]=ptr->next;
 
@@ -135,7 +190,7 @@ void genfreekey(struct genhashtable *ht, void * key) {
       ptr->iprev->inext=ptr->inext;
     if (ptr->inext!=NULL)
       ptr->inext->iprev=ptr->iprev;
-    
+
     RUNFREE(ptr);
     ht->counter--;
     return;
@@ -158,7 +213,9 @@ void genfreekey(struct genhashtable *ht, void * key) {
     }
     ptr=ptr->next;
   }
+#ifndef MULTICORE
   printf("XXXXXXXXX: COULDN'T FIND ENTRY FOR KEY %p\n",key);
+#endif
 }
 
 unsigned int genhashfunction(struct genhashtable *ht, void * key) {
@@ -169,11 +226,15 @@ unsigned int genhashfunction(struct genhashtable *ht, void * key) {
 }
 
 struct genhashtable * genallocatehashtable(unsigned int (*hash_function)(void *),int (*comp_function)(void *, void *)) {
-  struct genhashtable *ght=(struct genhashtable *) RUNMALLOC(sizeof(struct genhashtable));
-  struct genpointerlist **gpl=(struct genpointerlist **) RUNMALLOC(sizeof(struct genpointerlist *)*geninitialnumbins);
+  struct genhashtable *ght;
+  struct genpointerlist **gpl;
   int i;
-  for(i=0;i<geninitialnumbins;i++)
+
+  gpl=(struct genpointerlist **) RUNMALLOC(sizeof(struct genpointerlist *)*geninitialnumbins);
+  for(i=0; i<geninitialnumbins; i++) {
     gpl[i]=NULL;
+  }
+  ght=(struct genhashtable *) RUNMALLOC(sizeof(struct genhashtable));
   ght->hash_function=hash_function;
   ght->comp_function=comp_function;
   ght->currentsize=geninitialnumbins;
@@ -186,7 +247,7 @@ struct genhashtable * genallocatehashtable(unsigned int (*hash_function)(void *)
 
 void genfreehashtable(struct genhashtable * ht) {
   int i;
-  for (i=0;i<ht->currentsize;i++) {
+  for (i=0; i<ht->currentsize; i++) {
     if (ht->bins[i]!=NULL) {
       struct genpointerlist *genptr=ht->bins[i];
       while(genptr!=NULL) {