Bug fix for globals enabling the use of mempool based isomalloc
authorNikhil Jain <nikhil@illinois.edu>
Tue, 10 Jan 2012 07:23:52 +0000 (01:23 -0600)
committerNikhil Jain <nikhil@illinois.edu>
Tue, 10 Jan 2012 07:23:52 +0000 (01:23 -0600)
src/arch/util/mempool.c
src/conv-core/converse.h
src/conv-core/global-elfcopy.C
src/conv-core/global-elfgot.C
src/conv-core/global-macho.C
src/conv-core/global-nop.c
src/conv-core/isomalloc.c
src/libs/ck-libs/tcharm/tcharm.C

index de19805dcdb7169f636b76b8bd5e2fa56c21c3d0..a1b223e3d21ecbfd0a7dabe453588c595c1d3766 100644 (file)
@@ -205,6 +205,9 @@ void mempool_destroy(mempool_type *mptr)
   block_header *current,*tofree;
   mempool_freeblock   freefn = mptr->freeblockfn;
 
+  if(mptr == NULL)
+    return;
+
   current = tofree = &(mptr->block_head);
 
   while(current != NULL) {
index 183e9a0fabddfd3a7b9608378b844004e2612af2..6efcd3a064a47b3af64d7cdcceb59f8543215d53 100644 (file)
@@ -1279,7 +1279,7 @@ void CtgInit(void);
 CpvExtern(int, CmiPICMethod);
 
 /** Copy the current globals into this new set */
-CtgGlobals CtgCreate(void);
+CtgGlobals CtgCreate(CthThread tid);
 /** Install this set of globals. If g==NULL, returns to original globals. */
 void CtgInstall(CtgGlobals g);
 /** PUP this (not currently installed) globals set */
index 7e48e5b3d094dc64996082ba0ec5184e08adc3df..09b51754323acbf495e041acf45a4fe9c003be8d 100644 (file)
@@ -223,11 +223,11 @@ struct CtgGlobalStruct {
     void *data_seg;  
     int seg_size; /* size in bytes of data segment */
 
-    void allocate(int size) {
+    void allocate(int size, CthThread tid) {
       seg_size=size;
       /* global data segment need to be isomalloc */
       if (CmiMemoryIs(CMI_MEMORY_IS_ISOMALLOC))
-        data_seg=CmiIsomalloc(seg_size,NULL);
+        data_seg=CmiIsomalloc(seg_size,tid);
       else
         data_seg=malloc(seg_size);
       inited = 0;
@@ -238,8 +238,10 @@ struct CtgGlobalStruct {
       data_seg=0;
     }
     ~CtgGlobalStruct() {
-      if (data_seg) {
-        free(data_seg);
+      if (!CmiMemoryIs(CMI_MEMORY_IS_ISOMALLOC)) {
+        if (data_seg) {
+          free(data_seg);
+        }
       }
     }
 
@@ -250,9 +252,9 @@ void CtgGlobalStruct::pup(PUP::er &p) {
   p | seg_size;
   /* global data segment need to be isomalloc pupped */
   if (CmiMemoryIs(CMI_MEMORY_IS_ISOMALLOC))
-    CmiIsomallocPup(&p, &data_seg);
+    pup_bytes(&p, &data_seg, sizeof(void*));
   else {
-    if (p.isUnpacking()) allocate(seg_size);
+    if (p.isUnpacking()) allocate(seg_size, NULL);
     p((char *)data_seg, seg_size);
   }
 }
@@ -284,7 +286,7 @@ void CtgInit(void) {
       CmiPrintf("CHARM> -copyglobals enabled\n");
     }
 
-    g->allocate(l->getSize());
+    g->allocate(l->getSize(),NULL);
     l->read(g->data_seg);
     l->install(g->data_seg);
     _ctgList=l;
@@ -296,9 +298,9 @@ void CtgInit(void) {
 }
 
 /** Copy the current globals into this new set */
-CtgGlobals CtgCreate(void) {
+CtgGlobals CtgCreate(CthThread tid) {
   CtgGlobalStruct *g=new CtgGlobalStruct;
-  g->allocate(_ctgList->getSize());
+  g->allocate(_ctgList->getSize(), tid);
   _ctgList->read(g->data_seg);
   return g;
 }
index cd270e688e65637d9ba4d38efbeadfb04e4132bc..27df809ca8971ea6090da0fcf75c1295638694d6 100644 (file)
@@ -370,11 +370,11 @@ public:
     void *data_seg;  
     int seg_size; /* size in bytes of data segment */
     
-    void allocate(int size) {
+    void allocate(int size, CthThread tid) {
       seg_size=size;
         /* global data segment need to be isomalloc */
       if (CmiMemoryIs(CMI_MEMORY_IS_ISOMALLOC))
-        data_seg=CmiIsomalloc(seg_size,NULL);
+        data_seg=CmiIsomalloc(seg_size,tid);
       else
         data_seg=malloc(seg_size);
     }
@@ -386,7 +386,7 @@ public:
     ~CtgGlobalStruct() {
       if (data_seg) {
         if (CmiMemoryIs(CMI_MEMORY_IS_ISOMALLOC))
-          CmiIsomallocFree(data_seg);
+        { } //CmiIsomallocFree(data_seg);
         else
           free(data_seg);
         data_seg = NULL;
@@ -400,9 +400,9 @@ void CtgGlobalStruct::pup(PUP::er &p) {
     p | seg_size;
         /* global data segment need to be isomalloc pupped */
     if (CmiMemoryIs(CMI_MEMORY_IS_ISOMALLOC))
-      CmiIsomallocPup(&p, &data_seg);
+      pup_bytes(&p, &data_seg, sizeof(void*));
     else {
-      if (p.isUnpacking()) allocate(seg_size);
+      if (p.isUnpacking()) allocate(seg_size, NULL);
       p((char *)data_seg, seg_size);
     }
 }
@@ -430,7 +430,7 @@ void CtgInit(void) {
                        CmiPrintf("Charm++> -swapglobals enabled\n");
                }
                
-               g->allocate(l->getSize());
+               g->allocate(l->getSize(), NULL);
                l->read(g->data_seg);
                l->install(g->data_seg);
                _ctgList=l;
@@ -441,9 +441,9 @@ void CtgInit(void) {
 }
 
 /** Copy the current globals into this new set */
-CtgGlobals CtgCreate(void) {
+CtgGlobals CtgCreate(CthThread tid) {
        CtgGlobalStruct *g=new CtgGlobalStruct;
-       g->allocate(_ctgList->getSize());
+       g->allocate(_ctgList->getSize(), tid);
        _ctgList->read(g->data_seg);
        return g;
 }
index 2442f9f14630eebfaed969d57ccca05b09127e06..85dbe0ca367045152660b5e076d3a5fffa59bf31 100644 (file)
@@ -129,7 +129,7 @@ void CtgInit(void) {
 }
 
 /** Copy the current globals into this new set */
-CtgGlobals CtgCreate(void) {
+CtgGlobals CtgCreate(CthThread tid) {
        CtgGlobalStruct *g=new CtgGlobalStruct;
     const struct segment_command *seg = getsegbyname("__DATA");
     CHECK_MAGIC_NUM;
index f94ba5316be7d40f3fc999f9f7c1f4ecda230d38..17374fedf2af736cb31c804a33150be85dacaf96 100644 (file)
@@ -14,7 +14,7 @@ void CtgInit(void) {
         CpvAccess(CmiPICMethod) = 0;
 }
 void CtgInstall(CtgGlobals g) {}
-CtgGlobals CtgCreate(void) {return 0;}
+CtgGlobals CtgCreate(CthThread tid) {return 0;}
 CtgGlobals CtgPup(pup_er p,CtgGlobals g) { return 0;}
 void CtgFree(CtgGlobals g) {}
 CtgGlobals CtgCurrentGlobals(void) { return 0; }
index 5d15a62d07d57df411739b0ca30eca77cb20e317..a70124bc3c1e6f5d965a03c7a7ff25f4b85c7e87 100644 (file)
@@ -1648,7 +1648,7 @@ static void map_failed(CmiInt8 s,CmiInt8 n)
 CpvStaticDeclare(slotset *, myss); /*My managed slots*/
 
 #if CMK_USE_MEMPOOL_ISOMALLOC
-CtvStaticDeclare(mempool_type *, threadpool); /*Thread managed pools*/
+CtvDeclare(mempool_type *, threadpool); /*Thread managed pools*/
 
 //alloc function to be used by mempool
 void * isomallocfn (size_t *size, mem_handle_t *mem_hndl, int expand_flag)
index 7e5ff57bc2a9d3dd915c34fdcb54b48e6a6898f1..05068c36c58a644a0d5d0fa6998087ebdaee8132 100644 (file)
@@ -161,7 +161,6 @@ TCharm::TCharm(TCharmInitMsg *initMsg_)
   initMsg=initMsg_;
   initMsg->opts.sanityCheck();
   timeOffset=0.0;
-  threadGlobals=CtgCreate();
   if (tcharm_nothreads)
   { //Don't even make a new thread-- just use main thread
     tid=CthSelf();
@@ -178,6 +177,7 @@ TCharm::TCharm(TCharmInitMsg *initMsg_)
     BgUnsetStartOutOfCore();
 #endif
   }
+  threadGlobals=CtgCreate(tid);
   CtvAccessOther(tid,_curTCharm)=this;
   isStopped=true;
   resumeAfterMigration=false;