Added Idle Notification Functionality:
authorMilind Bhandarkar <milind@cs.uiuc.edu>
Mon, 17 Mar 1997 23:40:22 +0000 (23:40 +0000)
committerMilind Bhandarkar <milind@cs.uiuc.edu>
Mon, 17 Mar 1997 23:40:22 +0000 (23:40 +0000)
The new Macros in converse.h for this are:
CsdSetNotifyIdle(fn1, fn2)
CsdStartNotifyIdle()
CsdStopNotifyIdle()

src/arch/net-hp-cc/conv-mach.csh
src/arch/net/machine.c
src/conv-core/convcore.c
src/conv-core/converse.h

index e68ffe9b0ae5360e70dc2892974046d618cdffda..651765087d68ad2f0bf2404105661890a7ebe0d8 100644 (file)
 # REVISION HISTORY:
 #
 # $Log$
-# Revision 1.4  1996-10-22 19:08:31  milind
+# Revision 1.5  1997-03-17 23:40:28  milind
+# Added Idle Notification Functionality:
+# The new Macros in converse.h for this are:
+# CsdSetNotifyIdle(fn1, fn2)
+# CsdStartNotifyIdle()
+# CsdStopNotifyIdle()
+#
+# Revision 1.4  1996/10/22 19:08:31  milind
 # Added +z option to produce position independent code.
 # Needed for parallel perl.
 #
@@ -32,18 +39,18 @@ set CMK_CPP_CHARM='/lib/cpp -P'
 set CMK_CPP_C='cc -Aa -E'
 set CMK_LDRO='ld -r -o'
 set CMK_LDRO_WORKS=1
-set CMK_CC='cc -Aa -D_HPUX_SOURCE +z '
-set CMK_CC_RELIABLE='cc -Aa -D_HPUX_SOURCE +z '
-set CMK_CC_FASTEST='cc -Aa -D_HPUX_SOURCE +z '
-set CMK_CXX='CC -D_HPUX_SOURCE +z '
-set CMK_CXXPP='CC -Aa -D_HPUX_SOURCE -E +z '
+set CMK_CC='cc -Aa -D_HPUX_SOURCE '
+set CMK_CC_RELIABLE='cc -Aa -D_HPUX_SOURCE '
+set CMK_CC_FASTEST='cc -Aa -D_HPUX_SOURCE '
+set CMK_CXX='CC -D_HPUX_SOURCE '
+set CMK_CXXPP='CC -Aa -D_HPUX_SOURCE -E '
 set CMK_CF77=''
 set CMK_C_DEBUG='-g'
 set CMK_C_OPTIMIZE='-O'
 set CMK_CXX_DEBUG='-g'
 set CMK_CXX_OPTIMIZE='-O'
-set CMK_LD='cc -Aa -D_HPUX_SOURCE +z '
-set CMK_LDXX='CC +z '
+set CMK_LD='cc -Aa -D_HPUX_SOURCE '
+set CMK_LDXX='CC '
 set CMK_LD77=''
 set CMK_M4='m4'
 set CMK_SUF='o'
@@ -51,10 +58,10 @@ set CMK_AR='ar q'
 set CMK_RANLIB='true'
 set CMK_LIBS=''
 set CMK_SEQ_LIBS=''
-set CMK_SEQ_CC='cc -Aa -D_HPUX_SOURCE +z '
-set CMK_SEQ_LD='cc -Aa -D_HPUX_SOURCE +z '
-set CMK_SEQ_CXX='CC -D_HPUX_SOURCE +z '
-set CMK_SEQ_LDXX='CC -D_HPUX_SOURCE +z '
+set CMK_SEQ_CC='cc -Aa -D_HPUX_SOURCE '
+set CMK_SEQ_LD='cc -Aa -D_HPUX_SOURCE '
+set CMK_SEQ_CXX='CC -D_HPUX_SOURCE '
+set CMK_SEQ_LDXX='CC -D_HPUX_SOURCE '
 set CMK_NM='nm'
 set CMK_NM_FILTER="grep '|extern|' | sed -e 's@ *|.*@@'"
 set CMK_CPP_SUFFIX="i"
index 3681890724938a4b1faf70a0c04a5d805a50e855..c4ca617508055444cbbf5277f2052272547c9fb6 100644 (file)
@@ -1704,7 +1704,7 @@ void MoveDatagramsIntoSendWindow(OtherNode node)
     if (node->send_window[slot]) break;
     FIFO_Pop(node->send_queue);
     node->send_window[slot] = dg;
-    dg->nextxmit = 0;
+    dg->nextxmit = 0.0;
     FIFO_EnQueue(transmit_queue, (void *)dg);
   }
 }
index 47406853d4b1f66d142a4ec4b20e9efad9ee64e8..cc8d50d28dbff38713561606eb9d3c15e070be35 100644 (file)
@@ -496,6 +496,12 @@ void (*handler)();
  *
  *****************************************************************************/
 
+CpvDeclare(int, CsdStopNotifyFlag);
+CpvStaticDeclare(int, CsdIdleDetectedFlag);
+CpvDeclare(CmiHandler, CsdNotifyIdle);
+CpvDeclare(CmiHandler, CsdNotifyBusy);
+
+
 #if CMK_CMIDELIVERS_USE_COMMON_CODE
 
 CpvStaticDeclare(int, CmiBufferGrabbed);
@@ -523,6 +529,10 @@ int maxmsgs;
   while (1) {
     msg1 = CmiGetNonLocal();
     if (msg1) {
+      if(CpvAccess(CsdIdleDetectedFlag)) {
+         CpvAccess(CsdIdleDetectedFlag) = 0;
+         if(!CpvAccess(CsdStopNotifyFlag)) (CpvAccess(CsdNotifyBusy))();
+      }
       *buffergrabbed = 0;
       (CmiGetHandlerFunction(msg1))(msg1);
       if (!*buffergrabbed) CmiFree(msg1);
@@ -530,6 +540,10 @@ int maxmsgs;
     }
     FIFO_DeQueue(localqueue, &msg2);
     if (msg2) {
+      if(CpvAccess(CsdIdleDetectedFlag)) {
+         CpvAccess(CsdIdleDetectedFlag) = 0;
+         if(!CpvAccess(CsdStopNotifyFlag)) (CpvAccess(CsdNotifyBusy))();
+      }
       *buffergrabbed = 0;
       (CmiGetHandlerFunction(msg2))(msg2);
       if (!*buffergrabbed) CmiFree(msg2);
@@ -650,7 +664,6 @@ CthThread t;
  * 
  ***************************************************************************/
 
-
 CsdInit(argv)
   char **argv;
 {
@@ -659,10 +672,16 @@ CsdInit(argv)
   CpvInitialize(int,   disable_sys_msgs);
   CpvInitialize(void*, CsdSchedQueue);
   CpvInitialize(int,   CsdStopFlag);
+  CpvInitialize(int,   CsdStopNotifyFlag);
+  CpvInitialize(int,   CsdIdleDetectedFlag);
+  CpvInitialize(CmiHandler,   CsdNotifyIdle);
+  CpvInitialize(CmiHandler,   CsdNotifyBusy);
   
   CpvAccess(disable_sys_msgs) = 0;
   CpvAccess(CsdSchedQueue) = CqsCreate();
   CpvAccess(CsdStopFlag)  = 0;
+  CpvAccess(CsdStopNotifyFlag) = 1;
+  CpvAccess(CsdIdleDetectedFlag) = 0;
 }
 
 
@@ -685,23 +704,41 @@ int maxmsgs;
     return maxmsgs;
   }
   while (1) {
-    maxmsgs = CmiDeliverMsgs(maxmsgs);
+    int oldmaxmsgs, ndelivered;
+
+    oldmaxmsgs = maxmsgs;
+    maxmsgs = CmiDeliverMsgs(oldmaxmsgs);
+    ndelivered = oldmaxmsgs - maxmsgs;
     if (maxmsgs == 0) return maxmsgs;
     
     /* Check Scheduler queue */
     if ( !CqsEmpty(CpvAccess(CsdSchedQueue)) ) {
+      if(CpvAccess(CsdIdleDetectedFlag)) {
+        CpvAccess(CsdIdleDetectedFlag) = 0;
+        if(!CpvAccess(CsdStopNotifyFlag)) (CpvAccess(CsdNotifyBusy))();
+      }
       CqsDequeue(CpvAccess(CsdSchedQueue),&msg);
       (CmiGetHandlerFunction(msg))(msg);
       if (CpvAccess(CsdStopFlag)) return maxmsgs;
       maxmsgs--; if (maxmsgs==0) return maxmsgs;
     } else { /* Processor is idle */
+      if (ndelivered == 0 && !CpvAccess(CsdIdleDetectedFlag)) {
+        CpvAccess(CsdIdleDetectedFlag) = 1;
+        if(!CpvAccess(CsdStopNotifyFlag)) (CpvAccess(CsdNotifyIdle))();
+      }
 #if CMK_WHEN_PROCESSOR_IDLE_USLEEP
       struct timeval tv;
       tv.tv_usec=10000; tv.tv_sec=0;
       select(0,0,0,0,&tv);
 #endif
       CcdRaiseCondition(CcdPROCESSORIDLE) ;
-      if (CpvAccess(CsdStopFlag)) return maxmsgs;
+      if (CpvAccess(CsdStopFlag)) { 
+        if(CpvAccess(CsdIdleDetectedFlag)) {
+          CpvAccess(CsdIdleDetectedFlag) = 0;
+          if(!CpvAccess(CsdStopNotifyFlag)) (CpvAccess(CsdNotifyBusy))();
+        }
+        return maxmsgs;
+      }
     }
     
     if (!CpvAccess(disable_sys_msgs)) {
index 49d7222438ebb3152ecb398b8450fd79a98b49d0..7e62d994479e7b712f2820a33be367bda7b0c977 100644 (file)
  * REVISION HISTORY:
  *
  * $Log$
- * Revision 2.55  1997-02-13 09:31:02  jyelon
+ * Revision 2.56  1997-03-17 23:40:23  milind
+ * Added Idle Notification Functionality:
+ * The new Macros in converse.h for this are:
+ * CsdSetNotifyIdle(fn1, fn2)
+ * CsdStartNotifyIdle()
+ * CsdStopNotifyIdle()
+ *
+ * Revision 2.55  1997/02/13 09:31:02  jyelon
  * Modified everything for new main/ConverseInit structure
  *
  * Revision 2.54  1997/02/07 02:15:37  jyelon
@@ -413,6 +420,9 @@ typedef struct { char c[16]; }  CFloat16;
 CpvExtern(CmiHandler*, CmiHandlerTable);
 CpvExtern(void*,       CsdSchedQueue);
 CpvExtern(int,         CsdStopFlag);
+CpvExtern(CmiHandler, CsdNotifyIdle);
+CpvExtern(CmiHandler, CsdNotifyBusy);
+CpvExtern(int,        CsdStopNotifyFlag);
 
 extern int CmiRegisterHandler CMK_PROTO((CmiHandler));
 extern int CmiRegisterHandlerLocal CMK_PROTO((CmiHandler));
@@ -503,6 +513,10 @@ int   CmiScanf  CMK_PROTO((char *, ...));
 /********* CSD - THE SCHEDULER ********/
 
 extern  int CsdScheduler CMK_PROTO((int));
+#define CsdSetNotifyIdle(f1,f2) {CpvAccess(CsdNotifyIdle)=(f1);\
+                                 CpvAccess(CsdNotifyBusy)=(f2);}
+#define CsdStartNotifyIdle() (CpvAccess(CsdStopNotifyFlag)=0)
+#define CsdStopNotifyIdle() (CpvAccess(CsdStopNotifyFlag)=1)
 
 #if CMK_CSDEXITSCHEDULER_IS_A_FUNCTION
 extern void CsdExitScheduler CMK_PROTO((void));