void deliverResponse(DISPATCH_PTR dispatch) { if (dispatch->respProc) { (*dispatch->respProc)(dispatch, dispatch->respData); return; } if (!resourceSelfQuery(dispatch)) pendingReplyRemove(dispatch); if (dispatch->org->alive) { dispatch->resData->intent = QUERY_REPLY_INTENT; dispatch->resData->msgRef = dispatch->refId; (void)x_ipc_dataMsgSend(dispatch->org->writeSd, DISPATCH_RES_DATA(dispatch)); } else if (!dispatch->org->repliesPending) { moduleFree(dispatch->org); } }
/* The straightforward way to do this would be using "centralReply", but that calls "recvMessage" recursively, which breaks things. */ static void sendMultiQueryTermination (DISPATCH_PTR dispatch) { static DATA_MSG_PTR nullReplyData = NULL; if (!nullReplyData) { nullReplyData = x_ipc_dataMsgCreate(0, QUERY_REPLY_INTENT, 0, 0, 0, (FORMAT_PTR)NULL, (char *)NULL, (FORMAT_PTR)NULL, (char *)NULL); } nullReplyData->msgRef = dispatch->refId; if (!dispatch->org) X_IPC_ERROR("Error: sendMultiQueryTermination: No query origin."); else { if (dispatch->org->alive) { (void)x_ipc_dataMsgSend(dispatch->org->writeSd, nullReplyData); } else if (!dispatch->org->repliesPending) { moduleFree(dispatch->org); } } }