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(void)
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 int handlerNo=CmiImmediateHandler(msg);
00075 MACHSTATE2(4,"immediate message handler %d %d", CmiGetHandler(msg), handlerNo)
00076
00077 CmiHandlerInfo *h = &CpvAccess(CmiHandlerTable)[handlerNo];
00078 CmiAssert(h && h->hdlr);
00079
00080 MACHLOCK_ASSERT(_immRunning,"CmiHandleImmediateMessage");
00081 CQdProcess(CpvAccess(cQdState),1);
00082 (h->hdlr)(msg,h->userPtr);
00083 }
00084
00085
00086
00087
00088
00089
00090
00091
00092 void CmiHandleImmediate()
00093 {
00094 void *msg;
00095
00096
00097 if (!_immediateReady) return;
00098
00099
00100 if (CmiTryLock(CsvAccess(NodeState).immRecvLock)!=0) return;
00101
00102
00103
00104
00105
00106 MACHLOCK_ASSERT(!_immRunning,"CmiHandleImmediate");
00107 _immRunning=1;
00108 MACHSTATE(2,"Entered handleImmediate {")
00109
00110
00111 while (NULL!=(msg=PCQueuePop(CsvAccess(NodeState).immQ)))
00112 {
00113 currentImmediateMsg = msg;
00114 MACHSTATE(4,"calling immediate message handler {");
00115 CmiHandleImmediateMessage(msg);
00116 MACHSTATE(4,"} calling immediate message handler");
00117 }
00118
00119
00120 while (NULL!=(msg=PCQueuePop(CsvAccess(NodeState).delayedImmQ)))
00121 CmiPushImmediateMsg(msg);
00122
00123 MACHSTATE(2,"} exiting handleImmediate")
00124 _immRunning = 0;
00125
00126 CmiUnlock(CsvAccess(NodeState).immRecvLock);
00127
00128 CmiClearImmediateFlag();
00129 }
00130
00131 #endif
00132