Ccd callbacks now take the current wall clock time as their
authorOrion Lawlor <olawlor@acm.org>
Thu, 18 Dec 2003 22:19:41 +0000 (22:19 +0000)
committerOrion Lawlor <olawlor@acm.org>
Thu, 18 Dec 2003 22:19:41 +0000 (22:19 +0000)
second parameter.  This is intended to avoid duplicate timer
calls in, e.g., CCD_BEGIN_BUSY.

13 files changed:
src/arch/net/machine-dgram.c
src/arch/net/machine.c
src/ck-core/ckarray.C
src/ck-core/ckarray.h
src/ck-core/cklocation.C
src/ck-core/cklocation.h
src/ck-ldb/LBMachineUtil.C
src/ck-ldb/LBMachineUtil.h
src/conv-core/conv-conds.c
src/conv-core/convcore.c
src/conv-core/converse.h
src/libs/ck-libs/commlib/NodeMulticast.C
src/libs/ck-libs/commlib/StreamingStrategy.C

index 686b67d1ba4ad334e45fa7068708bd2b6fae7ce2..aeef48d1220a2453850c54841b3394e4698fc485 100644 (file)
@@ -547,7 +547,7 @@ static void CommunicationsClockCaller(void *ignored)
   CmiCommLock();
   CommunicationsClock();
   CmiCommUnlock();
-  CcdCallFnAfter(CommunicationsClockCaller,NULL,Cmi_comm_clock_delay);  
+  CcdCallFnAfter((CcdVoidFn)CommunicationsClockCaller,NULL,Cmi_comm_clock_delay);  
 }
 
 static void CommunicationPeriodic(void) 
@@ -558,7 +558,7 @@ static void CommunicationPeriodic(void)
 static void CommunicationPeriodicCaller(void *ignored)
 {
   CommunicationPeriodic();
-  CcdCallFnAfter(CommunicationPeriodicCaller,NULL,Cmi_comm_periodic_delay);
+  CcdCallFnAfter((CcdVoidFn)CommunicationPeriodicCaller,NULL,Cmi_comm_periodic_delay);
 }
 #endif
 
index 3cfb6b3e85e5b79900b3f9c702c2890651fc3e26..a9ea0545a2b638fdbc2f1dd540cab68e5f7b19a3 100644 (file)
@@ -949,7 +949,7 @@ static void pingCharmrun(void *ignored)
 static void pingCharmrunPeriodic(void *ignored)
 {
   pingCharmrun(ignored);
-  CcdCallFnAfter(pingCharmrunPeriodic,NULL,1000);
+  CcdCallFnAfter((CcdVoidFn)pingCharmrunPeriodic,NULL,1000);
 }
 
 static int ignore_further_errors(int c,const char *msg) {machine_exit(2);return -1;}
@@ -1852,7 +1852,7 @@ static void ConverseRunPE(int everReturn)
 #if CMK_SHARED_VARS_UNAVAILABLE
     if (Cmi_netpoll == 1) {
     /* gm cannot live with setitimer */
-    CcdCallFnAfter(pingCharmrunPeriodic,NULL,1000);
+    CcdCallFnAfter((CcdVoidFn)pingCharmrunPeriodic,NULL,1000);
     }
     else {
     /*Occasionally ping charmrun, to test if it's dead*/
@@ -1868,7 +1868,7 @@ static void ConverseRunPE(int everReturn)
 #if ! CMK_USE_GM && ! CMK_USE_TCP
     /*Occasionally check for retransmissions, outgoing acks, etc.*/
     /*no need in GM case */
-    CcdCallFnAfter(CommunicationsClockCaller,NULL,Cmi_comm_clock_delay);
+    CcdCallFnAfter((CcdVoidFn)CommunicationsClockCaller,NULL,Cmi_comm_clock_delay);
 #endif
 #endif
     
index ab896133b3c92bbf0f42bd4e948100b2d517ae00..924d38ccf5010b8feb49c36671e7371b2d4734c9 100644 (file)
@@ -259,7 +259,7 @@ inline void CkArray::springCleaning(void)
   broadcaster->springCleaning();
 }
 
-void CkArray::staticSpringCleaning(void *forArray) {
+void CkArray::staticSpringCleaning(void *forArray,double curWallTime) {
        ((CkArray *)forArray)->springCleaning();
 }
 
index 952039e88706d182688b06757598703df4337359..8c81b35d0835de79b003fd025b9efea529a33cb1 100644 (file)
@@ -603,7 +603,7 @@ private:
 
 //Spring cleaning
   void springCleaning(void);
-  static void staticSpringCleaning(void *forWhom);
+  static void staticSpringCleaning(void *forWhom,double curWallTime);
 
 //ArrayListeners:
 //Iterate over the CkArrayListeners in this vector, calling "inside" each time.
index 0eb69115ea714f4a870597580b8463488948e3ce..e25f95be0ebf0f168b7499ca073c5a5dd0eed41c 100644 (file)
@@ -1055,7 +1055,7 @@ inline void CkLocMgr::springCleaning(void)
   }
   delete it;
 }
-void CkLocMgr::staticSpringCleaning(void *forWhom) {
+void CkLocMgr::staticSpringCleaning(void *forWhom,double curWallTime) {
        DEBK((AA"Starting spring cleaning at %.2f\n"AB,CkWallTimer()));
        ((CkLocMgr *)forWhom)->springCleaning();
 }
index 3eb883e01f23b7490b4a6bd5bbbd37f5a143245d..73056a856375d74c7e49453cef983baa08c868eb 100644 (file)
@@ -621,7 +621,7 @@ private:
        CmiBool duringMigration;
 
        //Occasionally clear out stale remote pointers
-       static void staticSpringCleaning(void *mgr);
+       static void staticSpringCleaning(void *mgr,double curWallTime);
        void springCleaning(void);
        int nSprings;
 
index 14eb3c5acc89982e97cf49b0569ed88e31786fca..83b7a53dd090828ba0d48924632cb6fbdbf5a1bb 100644 (file)
 #include "LBMachineUtil.h"
 #include <stdlib.h>
 
-extern "C" void staticIdleStart(LBMachineUtil* obj)
+inline void LBMachineUtil::IdleStart(double curWallTime)
 {
-  obj->IdleStart();
+  start_idle = curWallTime;
 }
 
-extern "C" void staticIdleEnd(LBMachineUtil* obj)
+inline void LBMachineUtil::IdleEnd(double curWallTime)
 {
-  obj->IdleEnd();
+  if (state == on) {
+    const double stop_idle = curWallTime;
+    total_idletime += (stop_idle - start_idle);
+  }
 }
 
-
-void LBMachineUtil::IdleStart()
+void LBMachineUtil::staticIdleStart(LBMachineUtil* obj,double curWallTime)
 {
-  start_idle = CmiWallTimer();
+  obj->IdleStart(curWallTime);
 }
-
-void LBMachineUtil::IdleEnd()
+void LBMachineUtil::staticIdleEnd(LBMachineUtil* obj,double curWallTime)
 {
-  if (state == on) {
-    const double stop_idle = CmiWallTimer();
-    total_idletime += (stop_idle - start_idle);
-  }
+  obj->IdleEnd(curWallTime);
 }
 
 LBMachineUtil::LBMachineUtil()
index 6e80c9dc6e6f181a9949c871a6e96f1014aa1145..4db9a0f674cb4ad1848b816ad33df013999446c1 100644 (file)
@@ -23,9 +23,7 @@ public:
   void Clear();
   void TotalTime(double* walltime, double* cputime);
   void IdleTime(double* walltime) { *walltime = total_idletime; };
-  void IdleStart();
-  void IdleEnd();
-  
+
 private:
   enum { off, on } state;
   double total_walltime;
@@ -36,6 +34,11 @@ private:
   double start_idle;
 
   int cancel_idleStart, cancel_idleEnd;
+
+  void IdleStart(double curWallTime);
+  void IdleEnd(double curWallTime);
+  static void staticIdleStart(LBMachineUtil *util,double curWallTime);
+  static void staticIdleEnd(LBMachineUtil *util,double curWallTime);
 };
 
 #endif  // _LDMACHINEUTIL_H_
index 9f6b7f9f1702764d019eb50fbe43a985ac050e36..3f0f4d6b7b41c7860218a172247c12add6d78ac8 100644 (file)
@@ -134,12 +134,12 @@ static int append_elem(ccd_cblist *l, CcdVoidFn fn, void *arg, int pe)
  * ignored. callbacks are kept in the list even after they are called.
  * Note: it is illegal to cancel callbacks from within ccd callbacks.
  */
-static void call_cblist_keep(ccd_cblist *l)
+static void call_cblist_keep(ccd_cblist *l,double curWallTime)
 {
   int i, len = l->len, idx;
   for(i=0, idx=l->first;i<len;i++) {
     int old = CmiSwitchToPE(l->elems[idx].cb.pe);
-    (*(l->elems[idx].cb.fn))(l->elems[idx].cb.arg);
+    (*(l->elems[idx].cb.fn))(l->elems[idx].cb.arg,curWallTime);
     CmiSwitchToPE(old);
     idx = l->elems[idx].next;
   }
@@ -150,20 +150,20 @@ static void call_cblist_keep(ccd_cblist *l)
  * ignored. callbacks are removed from the list after they are called.
  * Note: it is illegal to cancel callbacks from within ccd callbacks.
  */
-static void call_cblist_remove(ccd_cblist *l)
+static void call_cblist_remove(ccd_cblist *l,double curWallTime)
 {
   int i, len = l->len, idx;
 #if ! CMK_BLUEGENE_CHARM
   for(i=0, idx=l->first;i<len;i++) {
     int old = CmiSwitchToPE(l->elems[idx].cb.pe);
-    (*(l->elems[idx].cb.fn))(l->elems[idx].cb.arg);
+    (*(l->elems[idx].cb.fn))(l->elems[idx].cb.arg,curWallTime);
     CmiSwitchToPE(old);
     idx = l->elems[idx].next;
   }
 #else
   for(i=0, idx=l->last;i<len;i++) {
     int old = CmiSwitchToPE(l->elems[idx].cb.pe);
-    (*(l->elems[idx].cb.fn))(l->elems[idx].cb.arg);
+    (*(l->elems[idx].cb.fn))(l->elems[idx].cb.arg,curWallTime);
     CmiSwitchToPE(old);
     idx = l->elems[idx].prev;
   }
@@ -306,13 +306,13 @@ static void ccd_heap_remove(void)
 
 /* If any of the CallFnAfter functions can now be called, call them 
  */
-static void ccd_heap_update(double ctime)
+static void ccd_heap_update(double curWallTime)
 {
   ccd_heap_elem *h = CpvAccess(ccd_heap);
   ccd_heap_elem *e = h+CpvAccess(ccd_heapmaxlen);
   int i,ne=0;
   /* Pull out all expired heap entries */
-  while ((CpvAccess(ccd_heaplen)>0) && (h[1].time<ctime)) {
+  while ((CpvAccess(ccd_heaplen)>0) && (h[1].time<curWallTime)) {
     e[ne++]=h[1];
     ccd_heap_remove();
   }
@@ -326,12 +326,12 @@ static void ccd_heap_update(double ctime)
       ccd_heap_elem *e = h+CpvAccess(ccd_heapmaxlen);
 */
       int old = CmiSwitchToPE(e[i].cb.pe);
-      (*(e[i].cb.fn))(e[i].cb.arg);
+      (*(e[i].cb.fn))(e[i].cb.arg,curWallTime);
       CmiSwitchToPE(old);
   }
 }
 
-void CcdCallBacksReset(void *ignored);
+void CcdCallBacksReset(void *ignored,double curWallTime);
 
 void CcdModuleInit(void)
 {
@@ -415,8 +415,9 @@ void CcdCallFnAfter(CcdVoidFn fnp, void *arg, unsigned int deltaT)
  */
 void CcdRaiseCondition(int condnum)
 {
-  call_cblist_remove(&(CpvAccess(conds).condcb[condnum]));
-  call_cblist_keep(&(CpvAccess(conds).condcb_keep[condnum]));
+  double curWallTime=CmiWallTimer();
+  call_cblist_remove(&(CpvAccess(conds).condcb[condnum]),curWallTime);
+  call_cblist_keep(&(CpvAccess(conds).condcb_keep[condnum]),curWallTime);
 }
 
 /* call functions to be called periodically, and also the time-indexed
@@ -428,12 +429,12 @@ void CcdCallBacks(void)
   ccd_periodic_callbacks *o=&CpvAccess(pcb);
   
   /* Figure out how many times to skip Ccd processing */
-  double currTime = CmiWallTimer();
+  double curWallTime = CmiWallTimer();
 
   unsigned int nSkip=o->nSkip;
 #if 1
 /* Dynamically adjust the number of messages to skip */
-  double elapsed = currTime - o->lastCheck;
+  double elapsed = curWallTime - o->lastCheck;
 #define targetElapsed 5.0e-3
   if (elapsed<targetElapsed) nSkip*=2; /* too short: process more */
   else /* elapsed>targetElapsed */ nSkip/=2; /* too long: process fewer */
@@ -449,14 +450,14 @@ void CcdCallBacks(void)
 #endif
 
   CpvAccess(_ccd_numchecks)=o->nSkip=nSkip;
-  o->lastCheck=currTime;
+  o->lastCheck=curWallTime;
   
-  ccd_heap_update(currTime);
+  ccd_heap_update(curWallTime);
   
   for (i=0;i<CCD_PERIODIC_MAX;i++) 
-    if (o->nextCall[i]<=currTime) {
+    if (o->nextCall[i]<=curWallTime) {
       CcdRaiseCondition(CcdPERIODIC+i);
-      o->nextCall[i]=currTime+periodicCallInterval[i];
+      o->nextCall[i]=curWallTime+periodicCallInterval[i];
     }
     else 
       break; /*<- because intervals are multiples of one another*/
@@ -464,12 +465,11 @@ void CcdCallBacks(void)
 
 /*Called when something drastic changes-- restart ccd_num_checks
 */
-void CcdCallBacksReset(void *ignored)
+void CcdCallBacksReset(void *ignored,double curWallTime)
 {
   ccd_periodic_callbacks *o=&CpvAccess(pcb);
-  double currTime=CmiWallTimer();
   CpvAccess(_ccd_numchecks)=o->nSkip=1;
-  o->lastCheck=currTime;
+  o->lastCheck=curWallTime;
 }
 
 
index 60aeed3a6b8ec8d576819b547f53531d5c26edd8..9a209a4c2302d5b5361eef766af161d6750cba9e 100644 (file)
@@ -1945,7 +1945,7 @@ typedef struct {
   int call_count;/*Number of timeout calls currently in flight*/
 } cmi_cpu_idlerec;
 
-static void on_timeout(cmi_cpu_idlerec *rec)
+static void on_timeout(cmi_cpu_idlerec *rec,double curWallTime)
 {
   rec->call_count--;
   if(rec->call_count==0 && rec->is_idle==1) {
@@ -1953,13 +1953,13 @@ static void on_timeout(cmi_cpu_idlerec *rec)
     CmiAbort("Exiting.\n");
   }
 }
-static void on_idle(cmi_cpu_idlerec *rec)
+static void on_idle(cmi_cpu_idlerec *rec,double curWallTime)
 {
   CcdCallFnAfter((CcdVoidFn)on_timeout, rec, rec->idle_timeout);
   rec->call_count++; /*Keeps track of overlapping timeout calls.*/  
   rec->is_idle = 1;
 }
-static void on_busy(cmi_cpu_idlerec *rec)
+static void on_busy(cmi_cpu_idlerec *rec,double curWallTime)
 {
   rec->is_idle = 0;
 }
index 349e510ee9d127eb3f2055bfbfa8a63f525bcd0e..c89a925e066c019214df79f0b177e72e0bbab752 100644 (file)
@@ -944,7 +944,7 @@ void CmiOutOfMemory(int nBytes);
 
 /******** CONVCONDS ********/
 
-typedef void (*CcdVoidFn)(void *);
+typedef void (*CcdVoidFn)(void *userParam,double curWallTime);
 
 /*CPU conditions*/
 #define CcdPROCESSOR_BEGIN_BUSY 0
index bb9665672f02b6c797c78403417349e5ea5e42d6..c207349d5a3d6d4912d72aa721eebe57d8909542 100644 (file)
@@ -7,7 +7,7 @@
 
 static NodeMulticast *nm_mgr;
 
-static void call_doneInserting(void *ptr){
+static void call_doneInserting(void *ptr,double curWallTime){
     NodeMulticast *mgr = (NodeMulticast *)ptr;
     mgr->doneInserting();
 }
@@ -258,7 +258,7 @@ void NodeMulticast::doneInserting(){
             prevCount ++;
             if((prevCount % MAX_SENDS_PER_BATCH == 0) &&
                (prevCount != numNodes)) {
-                CcdCallFnAfter(call_doneInserting, (void *)this, 
+                CcdCallFnAfter((CcdVoidFn)call_doneInserting, (void *)this, 
                                MULTICAST_DELAY);
                 return;
             }
index c0a72c40d6b7318e0859308563faceb6b5c683f4..776307e016fe7ac313b71d17556b137ecd590509 100644 (file)
@@ -78,7 +78,7 @@ void StreamingStrategy::periodicFlush(){
 }
 
 /// This routine is called via CcdCallFnAfter to flush all messages:
-static void call_delayFlush(void *arg){
+static void call_delayFlush(void *arg,double curWallTime){
     StreamingStrategy *s=(StreamingStrategy *)arg;
     s->periodicFlush();
     s->registerFlush(); //Set ourselves up to be called again
@@ -86,11 +86,11 @@ static void call_delayFlush(void *arg){
 
 void StreamingStrategy::registerFlush(void) {
     // CkPrintf("[%d] Will call function again every %d ms\n",CkMyPe(),PERIOD);
-    CcdCallFnAfter(call_delayFlush, (void *)this, PERIOD);
+    CcdCallFnAfter((CcdVoidFn)call_delayFlush, (void *)this, PERIOD);
 }
 
 /// This routine is called via CcdCallOnCondition to flush all messages:
-static void call_idleFlush(void *arg){
+static void call_idleFlush(void *arg,double curWallTime){
     StreamingStrategy *s=(StreamingStrategy *)arg;
     s->periodicFlush();
 }
@@ -98,7 +98,7 @@ static void call_idleFlush(void *arg){
 // When we're finally ready to go, register for timeout and idle flush.
 void StreamingStrategy::beginProcessing(int ignored) {
     registerFlush();
-    CcdCallOnConditionKeep(CcdPROCESSOR_BEGIN_IDLE,call_idleFlush,
+    CcdCallOnConditionKeep(CcdPROCESSOR_BEGIN_IDLE,(CcdVoidFn)call_idleFlush,
                            (void *)this);
 }