void processActiveMessage(DISPATCH_PTR dispatch) { hndSelect(dispatch); /* Moved here from "recvMessage" because need to wait until handler selected, (reids 10-92) */ if (dispatch->msg_class == QueryClass && !resourceSelfQuery(dispatch)) pendingReplyAdd(dispatch); if (DISPATCH_HANDLER_CHOOSEN(dispatch)) { processResourceAndDeliver(dispatch); } else { X_IPC_ERROR1("ERROR: processActiveMessage: No Handler Choosen for %s.\n", dispatch->msg->msgData->name); } }
static void registerVarHnd(DISPATCH_PTR dispatch, VAR_REG_PTR varRegData) { #ifdef UNUSED_PRAGMA #pragma unused(dispatch) #endif GLOBAL_VAR_PTR var; CONST_GLOBAL_VAR_PTR old_var; char *getMsgName, *setMsgName, *getSetMsgName, *watchMsgName; var = NEW(GLOBAL_VAR_TYPE); /* Create the data structure to hold information about the variable */ var->varName = varRegData->varName; var->format = varRegData->format; var->value = NULL; /* Create the name strings for the set and get messages.*/ setMsgName = (char *)x_ipcMalloc(1+strlen(var->varName)+ strlen(VAR_SET_PREFIX)); strcpy(setMsgName,VAR_SET_PREFIX); strcat(setMsgName,var->varName); getMsgName = (char *)x_ipcMalloc(1+strlen(var->varName)+ strlen(VAR_GET_PREFIX)); strcpy(getMsgName,VAR_GET_PREFIX); strcat(getMsgName,var->varName); getSetMsgName = (char *)x_ipcMalloc(1+strlen(var->varName)+ strlen(VAR_GET_SET_PREFIX)); strcpy(getSetMsgName,VAR_GET_SET_PREFIX); strcat(getSetMsgName,var->varName); watchMsgName = (char *)x_ipcMalloc(1+strlen(var->varName)+ strlen(VAR_WATCH_PREFIX)); strcpy(watchMsgName,VAR_WATCH_PREFIX); strcat(watchMsgName,var->varName); /* Free up the old var, if any */ old_var = (CONST_GLOBAL_VAR_PTR)x_ipc_hashTableInsert((void *)var->varName, 1+strlen(var->varName), (void *)var, GET_S_GLOBAL(varTable)); if (old_var != NULL) { /* The mesage is already registered, just check the format. */ if (strcmp(old_var->format,var->format)) { X_IPC_ERROR1("ERROR: centralRegisterVar: variable %s already registered" " with a differnt format.\n", var->varName); } /* Free the old var */ if (old_var->value) x_ipcFreeData(setMsgName, old_var->value); if (old_var->format) x_ipcFree((void *)old_var->format); x_ipcFree((void *)old_var->varName); x_ipcFree((void *)old_var); } /* Register the functions to set and get the variable value. */ centralRegisterInform(setMsgName, var->format, setVarHnd); centralRegisterQuery(getMsgName, NULL, var->format, getVarHnd); centralRegisterQuery(getSetMsgName, var->format, var->format, getSetVarHnd); centralRegisterBroadcastMessage(watchMsgName, var->format); x_ipcFree(setMsgName); x_ipcFree(getMsgName); x_ipcFree(getSetMsgName); x_ipcFree(watchMsgName); /* Just free top level structure -- The strings need to be saved */ x_ipcFree((char *) varRegData); }
static void abortCentral(int s) #endif { /* x_ipc_idTablePrintInfo(GET_S_GLOBAL(dispatchTable));*/ X_IPC_ERROR1("Central Abort : Signal %d",s); }
void recvMessage(DISPATCH_PTR dispatch, X_IPC_MSG_CLASS_TYPE msg_class, void *classData) { #ifdef UNUSED_PRAGMA #pragma unused(classData) #endif if (GET_S_GLOBAL(x_ipcDebugGlobal)) { x_ipc_idTablePrintInfo(GET_S_GLOBAL(dispatchTable)); X_IPC_MOD_WARNING("\n"); x_ipcStats(stderr); } switch(msg_class) { case QueryClass: case InformClass: tapWhenSent(dispatch); processActiveMessage(dispatch); break; case ReplyClass: recvReplyMessage(dispatch); break; #ifndef NMP_IPC case GoalClass: case PointMonitorClass: case DemonMonitorClass: case PollingMonitorClass: case ExceptionClass: case CommandClass: recvTaskTreeMessage(dispatch, msg_class, classData); break; #endif case BroadcastClass: recvBroadcastMessage(dispatch); break; #ifndef NMP_IPC case MultiQueryClass: recvMultiQueryMessage(dispatch); break; #endif case SuccessClass: case FailureClass: recvSuccessFailureMessage(dispatch, msg_class); break; #ifndef NMP_IPC case FireDemonClass: LOG_MESSAGE2("%-9s %15s [%d]:", "FireDemon", dispatch->msg->msgData->name, *(int32 *)classData); Log_RefId(dispatch, LOGGING_MESSAGE); LOG_MESSAGE1("%10s", dispatch->org->modData->modName); LOG_MESSAGE1(" --> %-15s (Sent)", GET_S_GLOBAL(x_ipcServerModGlobal)->modData->modName); Log_Time(1); LOG_MESSAGE("\n"); fireDemonHnd(dispatch, (int32 *)classData); break; #endif case HandlerRegClass: case UNKNOWN: case ExecHndClass: #ifndef TEST_CASE_COVERAGE default: #endif X_IPC_ERROR1("ERROR: recvMessage: class not implemented: %d\n", msg_class); } }