void processHandledMessage(DISPATCH_PTR dispatch) { dispatchUpdateAndDisplay(HandledDispatch, dispatch); resourceRemoveAttending(dispatch); tapAfterHandled(dispatch); if (dispatch->msg && !ONE_WAY_MSG(dispatch->msg)) { switch (dispatch->msg_class) { case SuccessClass: #ifndef NMP_IPC tapWhenSuccess(dispatch); tapAfterSuccess(dispatch); #endif break; #ifndef NMP_IPC case FailureClass: tapWhenFailure(dispatch); tapAfterFailure(dispatch); break; #endif default: /* X_IPC_MOD_ERROR("Unhandled default"); */ X_IPC_MOD_WARNING1("unhandled default in processHandledMessage %d\n", dispatch->msg_class); break; } } resourceProcessPending(dispatch); #ifndef NMP_IPC CompletionConstraints(dispatch); HandleKillAfterAttendingNodes(dispatch); #endif if (!dispatch->msg || ONE_WAY_MSG(dispatch->msg)) dispatchFree(dispatch); /* 14-May-91: fedor: exception class messages that are byPassed or retry should not be dispatch freed arbitrarly - may need to declare the first message handled and then resend the same dispatch through recvMessage */ }
void dispatchUpdateAndDisplay(DISPATCH_STATUS_TYPE newStatus, DISPATCH_PTR dispatch) { const char *Data; CONST_FORMAT_PTR Format; BOOLEAN ignored; BOOLEAN freeStruct = FALSE, keepStruct = FALSE; if (x_ipc_LogMessagesP()) { ignored = x_ipc_LogIgnoreP() && Ignore_Logging_Message(dispatch->msg); if (!ignored || !LogIgnoreAllP()) { if (ignored) Start_Ignore_Logging(); dispatchUpdateAndDisplay1(newStatus, dispatch); if ((newStatus == AttendingDispatch || dispatch->msg_class == ReplyClass) && x_ipc_LogDataP()) { if (dispatch->msg) { Data = NULL; if (newStatus == HandledDispatch) { MSG_PTR replyMsg; #ifdef NMP_IPC if (ONE_WAY_MSG(dispatch->msg) && dispatch->resData->classData) { replyMsg = getResponseMsg(dispatch->resData); Format = replyMsg->msgData->msgFormat; } else #endif { replyMsg = dispatch->msg; Format = dispatch->msg->msgData->resFormat; } parseMsgFormats(replyMsg); /* In case not yet parsed */ if (Format != NULL) { if ( (dispatch->resData) && (dispatch->resData->dataStruct)) { /* This is a central message, since the data is already here. */ freeStruct = FALSE; keepStruct = TRUE; Data = dispatch->resData->dataStruct; } else { Data = dispatchDecodeData(Format, dispatch->resData, &freeStruct); } #ifdef NMP_IPC if (Data && ONE_WAY_MSG(replyMsg) && replyMsg->msgData->resFormat) { log_IPC_Data(replyMsg, Data, dispatch->resData, freeStruct); } else #endif { Log_Data(Format, Data, 4); if (Data && freeStruct && (Data != dispatch->resData->msgData)) { /* free decoded data, including all its subelements */ x_ipc_freeDataStructure(Format, (void *)Data); Data = NULL; } else if ((dispatch->resData) && !keepStruct) { dispatch->resData->dataStruct = NULL; } } } } else { Format = dispatch->msg->msgData->msgFormat; if (Format != NULL) { Data = dispatchDecodeData(Format, dispatch->msgData, &freeStruct); #ifdef NMP_IPC if (Data && ONE_WAY_MSG(dispatch->msg) && dispatch->msg->msgData->resFormat) { log_IPC_Data(dispatch->msg, Data, dispatch->msgData, freeStruct); } else #endif { Log_Data(Format, Data, 4); if (Data && freeStruct && (Data != dispatch->msgData->msgData)){ /* free decoded data, including all its subelements */ x_ipc_freeDataStructure(Format, (void *)Data); } else if (dispatch->msgData) { dispatch->msgData->dataStruct = NULL; } Data = NULL; } } } } } if (ignored) End_Ignore_Logging(); } } DISPATCH_SET_STATUS(newStatus, dispatch); }