allocate memory in large blocks
authorbdemsky <bdemsky>
Wed, 8 Apr 2009 09:41:46 +0000 (09:41 +0000)
committerbdemsky <bdemsky>
Wed, 8 Apr 2009 09:41:46 +0000 (09:41 +0000)
Robust/src/Benchmarks/SingleTM/RainForest/RainForest.java
Robust/src/Benchmarks/SingleTM/RainForest/makefile
Robust/src/Runtime/STM/stm.c
Robust/src/Runtime/garbage.c
Robust/src/Runtime/garbage.h

index 7e3adc43b003bc07496aacfcbcdcebde3ff56a15..f714d4e2d0c098c0f3b54078118c0438b7c139ee 100644 (file)
@@ -1,6 +1,6 @@
 #define ROW                 100   /* columns in the map */
 #define COLUMN              100   /* rows of in the map */
-#define ROUNDS              256  /* Number of moves by each player */
+#define ROUNDS              2560  /* Number of moves by each player */
 #define PLAYERS             20    /* Number of Players when num Players != num of client machines */
 #define RATI0               0.5   /* Number of lumberjacks to number of planters */
 #define BLOCK               3     /* Area around the gamer to consider */
index 80c11f9c5fa889a01bef26ccdbd8833c4b97ab9c..1c48c05b5609dccc0e58d76d93246fc16158a3fe 100644 (file)
@@ -10,7 +10,7 @@ SRC=tmp${MAINCLASS}.java \
        Node.java \
        AStarPathFinder.java 
 
-FLAGS=-singleTM -optimize -mainclass ${MAINCLASS} -debug -transstats -joptimize -profile
+FLAGS=-singleTM -nooptimize -mainclass ${MAINCLASS} -debug -transstats -joptimize
 
 default:
        cpp ${MAINCLASS}.java > tmp1${MAINCLASS}.java
index 0074741dadd4bf11f687c8fbea0ef5d683818b0b..dc0dcfb6cac16a72ff6634c56ef0d59655ecb1bb 100644 (file)
@@ -103,7 +103,7 @@ void randomdelay() {
 
   t = time(NULL);
   req.tv_sec = 0;
-  req.tv_nsec = (long)(t%100); //1-11 microsec
+  req.tv_nsec = (long)(t%4); //1-11 microsec
   nanosleep(&req, NULL);
   return;
 }
@@ -160,18 +160,16 @@ __attribute__((pure)) void *transRead(void * oid) {
     return oid;
 
   /* Read from the main heap */
+  //No lock for now
   objheader_t *header = (objheader_t *)(((char *)oid) - sizeof(objheader_t)); 
-  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((unsigned int)oid, &objcopy[1]);
-    read_unlock(&header->lock);
-    return &objcopy[1];
-  }
+  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((unsigned int)oid, &objcopy[1]);
+  return &objcopy[1];
 }
 
 void freenewobjs() {
index 0b8e84655fccdc51a4de757a9de1829bdc3cf4c6..8f233fa4c6430332a5e3f2bcddb5a882bef2dd0a 100644 (file)
@@ -250,6 +250,11 @@ void enqueuetag(struct ___TagDescriptor___ *ptr) {
 }
 #endif
 
+#ifdef STM
+__thread char * memorybase=NULL;
+__thread char * memorytop=NULL;
+#endif
+
 
 void collect(struct garbagelist * stackptr) {
 #if defined(THREADS)||defined(DSTM)||defined(STM)
@@ -281,6 +286,7 @@ void collect(struct garbagelist * stackptr) {
   if (c_table!=NULL) {
       fixtable(&c_table, c_size);
       fixobjlist(newobjs);
+      memorybase=NULL;
   }
 #endif
 
@@ -310,6 +316,7 @@ void collect(struct garbagelist * stackptr) {
     if ((*listptr->tc_table)!=NULL) {
       fixtable(listptr->tc_table, listptr->tc_size);
       fixobjlist(listptr->objlist);
+      (*listptr->base)=NULL;
     }
 #endif
     stackptr=listptr->stackptr;
@@ -569,7 +576,6 @@ void checkcollect2(void * ptr) {
 }
 #endif
 
-
 struct listitem * stopforgc(struct garbagelist * ptr) {
   struct listitem * litem=malloc(sizeof(struct listitem));
   litem->stackptr=ptr;
@@ -580,6 +586,7 @@ struct listitem * stopforgc(struct garbagelist * ptr) {
   litem->tc_size=c_size;
   litem->tc_table=&c_table;
   litem->objlist=newobjs;
+  litem->base=&memorybase;
 #endif
   litem->prev=NULL;
   pthread_mutex_lock(&gclistlock);
@@ -612,7 +619,26 @@ void restartaftergc(struct listitem * litem) {
 }
 #endif
 
+#ifdef STM
+#define MEMORYBLOCK 65536
+void * helper(struct garbagelist *, int);
 void * mygcmalloc(struct garbagelist * stackptr, int size) {
+  if ((size&7)!=0)
+    size=(size&~7)+8;
+  if (memorybase==NULL||(memorybase+size)>memorytop) {
+    int toallocate=(size>MEMORYBLOCK)?size:MEMORYBLOCK;
+    memorybase=helper(stackptr, toallocate);
+    memorytop=memorybase+toallocate;
+  }
+  char *retvalue=memorybase;
+  memorybase+=size;
+  return retvalue;
+}
+
+void * helper(struct garbagelist * stackptr, int size) {
+#else
+void * mygcmalloc(struct garbagelist * stackptr, int size) {
+#endif
   void *ptr;
 #if defined(THREADS)||defined(DSTM)||defined(STM)
   if (pthread_mutex_trylock(&gclock)!=0) {
index 7d7417abaeaae21055148af04546f17dd4d40745..35b886212a10ce9d64d6a739d9295cda0dc45275 100644 (file)
@@ -20,6 +20,7 @@ struct listitem {
   unsigned int tc_size;
   chashlistnode_t **tc_table;
   struct objlist * objlist;
+  char **base;
 #endif
 };