Added TCharmWallTimer call, which uses a thread-specific offset to
authorOrion Lawlor <olawlor@acm.org>
Tue, 9 Apr 2002 23:24:22 +0000 (23:24 +0000)
committerOrion Lawlor <olawlor@acm.org>
Tue, 9 Apr 2002 23:24:22 +0000 (23:24 +0000)
make timers look monotonic even across processors.

src/libs/ck-libs/tcharm/tcharm.C
src/libs/ck-libs/tcharm/tcharm.h
src/libs/ck-libs/tcharm/tcharmc.h

index 1483daca9503e9fc2402a570a9f0c27d5e7e27f6..b137ec3a9be36c45100c494f7a0e3b78d80af5c5 100644 (file)
@@ -81,6 +81,7 @@ static void startTCharmThread(TCharmInitMsg *msg)
 TCharm::TCharm(TCharmInitMsg *initMsg_)
 {
   initMsg=initMsg_;
+  timeOffset=0.0;
   if (tcharm_nothreads) 
   { //Don't even make a new thread-- just use main thread
     tid=CthSelf();
@@ -138,6 +139,10 @@ void TCharm::pup(PUP::er &p) {
     tid = CthPup((pup_er) &p, tid);
     CtvAccessOther(tid,_curTCharm)=this;
     CmiIsomallocBlockListPup((pup_er) &p,&heapBlocks);
+    //Restart our clock: set it up so packTime==CkWallTimer+timeOffset
+    double packTime;
+    p(packTime);
+    timeOffset=packTime-CkWallTimer();
   }
   
   //Pack all user data
@@ -153,6 +158,9 @@ void TCharm::pup(PUP::er &p) {
     s.seek(1);
     tid = CthPup((pup_er) &p, tid);
     CmiIsomallocBlockListPup((pup_er) &p,&heapBlocks);
+    //Stop our clock:
+    double packTime=CkWallTimer()+timeOffset;
+    p(packTime);
   }
   s.endBlock(); //End of seeking block
 }
@@ -672,6 +680,14 @@ FDECL void FTN_NAME(TCHARM_DONE,tcharm_done)(void)
        TCharmDone();
 }
 
+CDECL double TCharmWallTimer(void) 
+{
+  TCHARMAPI("TCharmWallTimer");
+  if(TCharm::getState()!=inDriver) return CkWallTimer();
+  else { //Have to apply current thread's time offset
+    return CkWallTimer()+TCharm::get()->getTimeOffset();
+  }
+}
 
 
 #include "tcharm.def.h"
index 175c0a14de463bf78b21a96cad370f9b0f0cd1ee..d17ed79e2087f661a7953eb054ff5100517c9b19 100644 (file)
@@ -104,6 +104,7 @@ class TCharm: public ArrayElement1D
        
        bool isStopped;
        ThreadInfo threadInfo;
+       double timeOffset; //Value to add to CkWallTimer to get my clock
 
        enum {maxUserData=16};
        int nUd;
@@ -128,6 +129,8 @@ class TCharm: public ArrayElement1D
        //Start running the thread for the first time
        void run(void);
 
+       inline double getTimeOffset(void) const { return timeOffset; }
+
 //Client-callable routines:
        //One client is ready to run
        void ready(void);
index 8b347a0adcf9f9a2ad0ae19aa58f644e08ce1194..65367b6f38d2a6e1a47b704420f6c3e05532df87 100644 (file)
@@ -57,6 +57,8 @@ void *TCharmGetUserdata(int id);
 void TCharmMigrate(void);
 void TCharmDone(void);
 
+/*Get the local wall clock*/
+double TCharmWallTimer(void);
 
 #ifdef __cplusplus
 };