Merge branch 'charm' of charmgit:charm into charm
authorFilippo Gioachin <gioachin@uiuc.edu>
Wed, 7 Jul 2010 09:10:36 +0000 (04:10 -0500)
committerFilippo Gioachin <gioachin@uiuc.edu>
Wed, 7 Jul 2010 09:10:36 +0000 (04:10 -0500)
src/ck-core/ck.C
src/ck-core/debug-charm.C
src/conv-core/converse.h
src/conv-core/memory-charmdebug.c
src/conv-core/memory.c

index 2ce8fce32b549d7be5dd0ee0f5fd69744f1b778f..8531e5c165fd04d874ec8d625338e9929368f6c9 100644 (file)
@@ -2434,6 +2434,7 @@ CpvExtern(int      , CthResumeBigSimThreadIdx);
 
 #include "ckliststring.h"
 void CkMessageWatcherInit(char **argv,CkCoreState *ck) {
+    CmiArgGroup("Charm++","Record/Replay");
     CmiBool forceReplay = CmiFalse;
     char *procs = NULL;
     _replaySystem = 0;
index 3ff8fde7eca2852dce4a5d8a6b6934104a18c4e9..48daa77ae9c35332d5ec4a087e97e5d3a87b8634 100644 (file)
@@ -78,6 +78,7 @@ void CpdBeforeEp(int ep, void *obj, void *msg) {
     memoryBackup = &_debugData.peek().memoryBackup;
     if (!_entryTable[ep]->inCharm) {
       CpdResetMemory();
+      CpdSystemExit();
     }
     CkVec<DebugPersistentCheck> &preExecutes = CkpvAccess(_debugEntryTable)[ep].preProcess;
     for (int i=0; i<preExecutes.size(); ++i) {
@@ -98,6 +99,7 @@ void CpdAfterEp(int ep) {
     }
     memoryBackup = &entry.memoryBackup;
     if (!_entryTable[ep]->inCharm) {
+      CpdSystemEnter();
       CpdCheckMemory();
     }
     if (entry.msg != NULL) CmiFree(UsrToEnv(entry.msg));
index fabc93fadc2652692bd382310a7e11a56a8ea1e1..9d4ac06c7a52e83a15123cb291369d1efbad585c 100644 (file)
@@ -85,6 +85,8 @@ extern "C" {
 
 /* Global variables used by charmdebug to maintain information */
 extern void CpdSetInitializeMemory(int v);
+extern void CpdSystemEnter();
+extern void CpdSystemExit();
 #if CMK_ERROR_CHECKING
 extern int memory_status_info;
 extern int memory_chare_id;
index d024bf1d02026152d75aeacaf00093cd111d0243..e834d3fdef5348a39e37caa09f4f432d762c6922 100644 (file)
@@ -51,6 +51,7 @@ struct _Slot {
   int userSize;
 
 #define FLAGS_MASK        0xFF
+#define BLOCK_PROTECTED   0x80
 #define MODIFIED          0x40
 #define NEW_BLOCK         0x20
 #define LEAK_CLEAN        0x10
@@ -134,6 +135,10 @@ static int isLeakSlot(Slot *s) {
   return s->magic & LEAK_FLAG;
 }
 
+static int isProtected(Slot *s) {
+  return s->magic & BLOCK_PROTECTED;
+}
+
 int Slot_ChareOwner(void *s) {
   return ((Slot*)s)->chareID;
 }
@@ -1049,6 +1054,7 @@ static void protectMemory() {
 #else
       char * data = (char *)cur;
 #endif
+      cur->magic |= BLOCK_PROTECTED;
       mprotect(data, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ);
     } /*else printf(" (%p)",cur->userData);*/
   SLOT_ITERATE_END
@@ -1066,6 +1072,7 @@ static void unProtectMemory() {
       char * data = (char *)cur;
 #endif
     mprotect(data, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ|PROT_WRITE);
+    cur->magic &= ~BLOCK_PROTECTED;
   SLOT_ITERATE_END
   /*printf("unprotecting memory\n");*/
 #endif
@@ -1102,11 +1109,20 @@ void CpdSystemEnter() {
   Slot *cur;
   if (++cpdInSystem == 1) {
     if (CpdMprotect) {
+      int count=0;
       SLOT_ITERATE_START(cur)
         if (cur->chareID == 0) {
-          mprotect(cur, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ|PROT_WRITE);
+#ifdef CMK_SEPARATE_SLOT
+          char * data = cur->userData;
+#else
+          char * data = (char *)cur;
+#endif
+          mprotect(data, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ|PROT_WRITE);
+          cur->magic &= ~BLOCK_PROTECTED;
+          count++;
         }
       SLOT_ITERATE_END
+      //printf("CpdSystemEnter: unprotected %d elements\n",count);
     }
   }
 #endif
@@ -1118,11 +1134,20 @@ void CpdSystemExit() {
   int i;
   if (--cpdInSystem == 0) {
     if (CpdMprotect) {
+      int count=0;
       SLOT_ITERATE_START(cur)
         if (cur->chareID == 0) {
-          mprotect(cur, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ);
+#ifdef CMK_SEPARATE_SLOT
+          char * data = cur->userData;
+#else
+          char * data = (char *)cur;
+#endif
+          cur->magic |= BLOCK_PROTECTED;
+          mprotect(data, cur->userSize+SLOTSPACE+cur->stackLen*sizeof(void*), PROT_READ);
+          count++;
         }
       SLOT_ITERATE_END
+      //printf("CpdSystemExit: protected %d elements\n",count);
       /* unprotect the pages that have been unprotected by a signal SEGV */
       for (i=0; i<unProtectedPagesSize; ++i) {
         mprotect(unProtectedPages[i], 4, PROT_READ|PROT_WRITE);
@@ -1229,13 +1254,15 @@ static void *setSlot(Slot **sl,int userSize) {
   Slot *s = *sl;
   char *user=(char*)(s+1);
 
-  /* TODO: Handle correctly memory protection while changing neighbor blocks */
-  if (CpdMprotect) {
-    if (s->next->chareID != 0); 
-  }
-  /* Splice into the slot list just past the head */
+  /* Splice into the slot list just past the head (part 1) */
   s->next=slot_first->next;
   s->prev=slot_first;
+  /* Handle correctly memory protection while changing neighbor blocks */
+  if (CpdMprotect) {
+    mprotect(s->next, 4, PROT_READ | PROT_WRITE);
+    mprotect(s->prev, 4, PROT_READ | PROT_WRITE);
+  }
+  /* Splice into the slot list just past the head (part 2) */
   s->next->prev=s;
   s->prev->next=s;
 
@@ -1244,6 +1271,10 @@ static void *setSlot(Slot **sl,int userSize) {
     resetSlotCRC(s->next + 1);
     resetSlotCRC(s->prev + 1);
   }
+  if (CpdMprotect) {
+    if (isProtected(s->next)) mprotect(s->next, 4, PROT_READ);
+    if (isProtected(s->prev)) mprotect(s->prev, 4, PROT_READ);
+  }
 #endif
 
   /* Set the last 4 bits of magic to classify the memory together with the magic */
@@ -1290,6 +1321,11 @@ static void freeSlot(Slot *s) {
    * the pointer "s" becomes invalid.
    */
 #else
+  /* Handle correctly memory protection while changing neighbor blocks */
+  if (CpdMprotect) {
+    mprotect(s->next, 4, PROT_READ | PROT_WRITE);
+    mprotect(s->prev, 4, PROT_READ | PROT_WRITE);
+  }
   /* Splice out of the slot list */
   s->next->prev=s->prev;
   s->prev->next=s->next;
@@ -1298,6 +1334,10 @@ static void freeSlot(Slot *s) {
     resetSlotCRC(s->next + 1);
     resetSlotCRC(s->prev + 1);
   }
+  if (CpdMprotect) {
+    if (isProtected(s->next)) mprotect(s->next, 4, PROT_READ);
+    if (isProtected(s->prev)) mprotect(s->prev, 4, PROT_READ);
+  }
   s->prev=s->next=(Slot *)0;//0x0F00; why was it not 0?
 
   s->magic=SLOTMAGIC_FREED;
@@ -1358,6 +1398,7 @@ static void meta_init(char **argv) {
   }
   if (CmiGetArgFlagDesc(argv,"+memory_backup", "Backup all memory at every entry method")) {
     CpdMemBackup = 1;
+    saveAllocationHistory = 1;
   }
   if (CmiGetArgFlagDesc(argv,"+memory_crc", "Use CRC32 to detect memory changes")) {
     CpdCRC32 = 1;
index 04d53b7a7d47aedfaf7936d14ebed0565591e2ff..64f2f4bbda3f599619ffb6146f72b973f7d8a222 100644 (file)
@@ -57,7 +57,7 @@
 #include "converse.h"
 
 void * memory_stack_top; /*The higher end of the stack (approximation)*/
-int cpdInSystem=0;
+int cpdInSystem=1; /*Start inside the system (until we start executing user code)*/
 
 /*Choose the proper default configuration*/
 #if CMK_MEMORY_BUILD_DEFAULT
@@ -305,6 +305,7 @@ void CmiMemoryInit(argv)
 {
   CmiMemoryIs_flag |= CMI_MEMORY_IS_OS;
 #if CMK_MEMORY_BUILD_OS_WRAPPED || CMK_MEMORY_BUILD_GNU_HOOKS
+  CmiArgGroup("Converse","Memory module");
   meta_init(argv);
 #endif
   CmiOutOfMemoryInit();
@@ -558,6 +559,7 @@ The locking code is common to all implementations except OS-builtin.
 
 void CmiMemoryInit(char **argv)
 {
+  CmiArgGroup("Converse","Memory module");
   meta_init(argv);
   CmiOutOfMemoryInit();
 }