Adding hook when resuming a normal thread of execution (i.e not the main thread or...
authorFilippo Gioachin <gioachin@uiuc.edu>
Thu, 4 Feb 2010 07:22:25 +0000 (01:22 -0600)
committerFilippo Gioachin <gioachin@uiuc.edu>
Thu, 4 Feb 2010 07:22:25 +0000 (01:22 -0600)
This allows Converse or any higher language to decide if the thread switch should really be performed or not.

This has been added for the benefit of record/replay, so the replaying mechanism can reorder these messages as well.

src/ck-core/ck.C
src/ck-core/ck.h
src/ck-perf/trace-converse.c
src/conv-core/convcore.c

index ca250a135ea956bafdd941e3b5f8cf1edb51aa5c..efe2232ebfd53791786eb0370e6d72cae67a1c05 100644 (file)
@@ -2044,6 +2044,14 @@ extern "C" void CkMessageReplayQuiescence(void *rep, double time) {
   //CmiStartQD(CkMessageReplayQuiescence, replay);
 }
 
+extern "C" int CmiExecuteThreadResume(CthThreadToken *token) {
+  CkCoreState *ck = CkpvAccess(_coreState);
+  if (ck->watcher!=NULL) {
+    return ck->watcher->processThread(token,ck);
+  }
+  return 1;
+}
+
 #include "trace-common.h" /* For traceRoot and traceRootBaseLength */
 
 static FILE *openReplayFile(const char *prefix, const char *suffix, const char *permissions) {
index 31db8f4db148564c4a751eda7475789780191c9d..d412c8dc4532e328e87dba407ab754a58eb35987 100644 (file)
@@ -100,9 +100,16 @@ public:
          result &= process(env, ck);
          return result;
        }
+       inline int processThread(CthThreadToken *token, CkCoreState *ck) {
+          int result = 1;
+          if (next != NULL) result &= next->processThread(token, ck);
+          result &= process(token, ck);
+          return result;
+       }
 protected:
-    /** This is used internally by this class to call the correct subclass method */
+    /** These are used internally by this class to call the correct subclass method */
        virtual CmiBool process(envelope *env,CkCoreState *ck) =0;
+       virtual int process(CthThreadToken *token, CkCoreState *ck) {return 1;}
 public:
     inline void setNext(CkMessageWatcher *w) { next = w; }
 };
index 20facf9b5cbbcc75a39e07e3d9569626923ed71e..25c520058aacc9a3221a23f4800f91f5e8a78b94 100644 (file)
@@ -49,5 +49,6 @@ void traceEndFuncProj(char *name){}
 void traceUserSuppliedNote(char *note) {}
 
 /* This routine, included in Charm++ programs from init.C, needs to be present in converse as well.
-   Here is a place where it gets included only in converse, and not in Charm++ (thus not generating conflicts. */
+   Here is a place where it gets included only in converse, and not in Charm++ (thus not generating conflicts). */
 void EmergencyExit(void) {}
+int CmiExecuteThreadResume(CthThreadToken *token) {}
index 21122161e67a26a57bef5c4a1fd4c839b03f49bb..e90ec004c4d95deaea0ec0d8fefdbfcb40103f59 100644 (file)
@@ -1716,12 +1716,16 @@ void CthResumeNormalThread(CthThreadToken* token)
                resumeTraceCore();*/
 #endif
 #endif
-
+  
   /* BIGSIM_OOC DEBUGGING
   CmiPrintf("In CthResumeNormalThread:   ");
   CthPrintThdMagic(t);
   */
-  CthResume(t);
+
+  /* For Record/Replay debugging: need to notify the upper layer that we are resuming a thread */
+  if (CmiExecuteThreadResume(token)) {
+    CthResume(t);
+  }
 }
 
 void CthResumeSchedulingThread(CthThreadToken  *token)