00001
00010
00011
00012
00013
00014
00015 int _immediateReady = 0;
00016
00017 int _immRunning=0;
00018
00019
00020
00021
00022 #if CMK_IMMEDIATE_MSG
00023
00024
00025 static void *currentImmediateMsg=NULL;
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035 void CmiPushImmediateMsg(void *msg)
00036 {
00037 MACHSTATE(4,"pushing immediate message {");
00038
00039
00040
00041
00042 CmiLock(CsvAccess(NodeState).immSendLock);
00043 PCQueuePush(CsvAccess(NodeState).immQ, (char *)msg);
00044 CmiUnlock(CsvAccess(NodeState).immSendLock);
00045 MACHSTATE(4,"} pushing immediate message");
00046 }
00047
00048
00049
00050
00051
00052
00053
00054
00055 void CmiDelayImmediate()
00056 {
00057 MACHLOCK_ASSERT(_immRunning,"CmiDelayImmediate");
00058
00059 CQdCreate(CpvAccess(cQdState),1);
00060 MACHSTATE(5,"Actually delaying an immediate message");
00061 PCQueuePush(CsvAccess(NodeState).delayedImmQ, (char *)currentImmediateMsg);
00062 }
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072 void CmiHandleImmediateMessage(void *msg) {
00073
00074 #if (defined(_FAULT_MLOG_) || defined(_FAULT_CAUSAL_))
00075 CmiAssert(0);
00076 #endif
00077 int handlerNo=CmiImmediateHandler(msg);
00078 MACHSTATE2(4,"immediate message handler %d %d", CmiGetHandler(msg), handlerNo)
00079
00080 CmiHandlerInfo *h = &CpvAccess(CmiHandlerTable)[handlerNo];
00081 CmiAssert(h && h->hdlr);
00082
00083 MACHLOCK_ASSERT(_immRunning,"CmiHandleImmediateMessage");
00084 CQdProcess(CpvAccess(cQdState),1);
00085 (h->hdlr)(msg,h->userPtr);
00086 }
00087
00088
00089
00090
00091
00092
00093
00094
00095 void CmiHandleImmediate()
00096 {
00097 void *msg;
00098
00099
00100 if (!_immediateReady) return;
00101
00102
00103 if (CmiTryLock(CsvAccess(NodeState).immRecvLock)!=0) return;
00104
00105
00106
00107
00108
00109 MACHLOCK_ASSERT(!_immRunning,"CmiHandleImmediate");
00110 _immRunning=1;
00111 MACHSTATE(2,"Entered handleImmediate {")
00112
00113
00114 while (NULL!=(msg=PCQueuePop(CsvAccess(NodeState).immQ)))
00115 {
00116 currentImmediateMsg = msg;
00117 MACHSTATE(4,"calling immediate message handler {");
00118 CmiHandleImmediateMessage(msg);
00119 MACHSTATE(4,"} calling immediate message handler");
00120 }
00121
00122
00123 while (NULL!=(msg=PCQueuePop(CsvAccess(NodeState).delayedImmQ)))
00124 CmiPushImmediateMsg(msg);
00125
00126 MACHSTATE(2,"} exiting handleImmediate")
00127 _immRunning = 0;
00128
00129 CmiUnlock(CsvAccess(NodeState).immRecvLock);
00130
00131 CmiClearImmediateFlag();
00132 }
00133
00134 #endif
00135