示例#1
0
void dispatchFree(DISPATCH_PTR dispatch)
{
  if (dispatch->refCount <= 0 && 
      dispatch->status != UnallocatedDispatch) { /* 5-13-93 reids: Changed */
    dispatch->refId = NO_REF;
    dispatch->orgId = 0;
    dispatch->desId = 0;
    dispatch->pRef = NO_REF;	/* 9-Jul-90: fedor: change to ROOT_NODE */
    dispatch->org = NULL;
    dispatch->des = NULL;
    
    dispatch->msg = NULL;
    dispatch->hnd = NULL;
    
    dispatch->resource = NULL;
    
#ifndef NMP_IPC
    dispatch->treeNode = NULL;
#endif
    dispatch->blockCom = NULL;
    dispatch->status = UnallocatedDispatch;
    
    x_ipc_dataMsgFree(dispatch->msgData);
    x_ipc_dataMsgFree(dispatch->resData);
    
    dispatch->msgData = NULL;
    dispatch->resData = NULL;
    
    /* Command class data is stored in "blockCom"; It has already been freed */
    if (dispatch->msg_class != CommandClass) 
      x_ipc_classDataFree(dispatch->msg_class, dispatch->classData);
    dispatch->classData = NULL;
    dispatch->msg_class = UNKNOWN;
    
    dispatch->respProc = NULL;
    dispatch->respData = NULL;
    
    freeTapInfo(&(dispatch->tapInfo));
    dispatch->tapInfo = NULL;
    
    dispatch->refCount = 0;
    
    dispatch->next = GET_S_GLOBAL(dispatchFreeListGlobal);
    GET_S_GLOBAL(dispatchFreeListGlobal) = dispatch;
  }
}
示例#2
0
void recvMessageBuild(MODULE_PTR module, DATA_MSG_PTR dataMsg)
{
  char *classData;
  MSG_PTR msg = NULL;
  
  DISPATCH_PTR dispatch;
  X_IPC_MSG_CLASS_TYPE msg_class;
  CLASS_FORM_PTR classForm;
  
  CONST_FORMAT_PTR classFormat = NULL;
  
  if (dataMsg->intent != NO_REF)
    msg = (MSG_PTR)idTableItem(ABS(dataMsg->intent), GET_C_GLOBAL(msgIdTable));
  
  msg_class = (X_IPC_MSG_CLASS_TYPE)dataMsg->classId;
  classForm = GET_CLASS_FORMAT(&msg_class);
  
  if (classForm)
    classFormat = classForm->format;
  
  classData = (char *)x_ipc_dataMsgDecodeClass(classFormat, dataMsg);
  
  if (dataMsg->dispatchRef != NO_REF) {
    dispatch = DISPATCH_FROM_ID(dataMsg->dispatchRef);
  } else {
    dispatch = dispatchAllocate();
    dispatch->msg = msg;
    
    dispatch->org = module;
    dispatch->orgId = module->readSd;
    
    dispatch->refId = dataMsg->msgRef;
    dispatch->pRef = dataMsg->parentRef;
  }
  
  if (dispatch == NULL)
    /* Probably a reply that was not needed */
    return;
  
  if (dataMsg->msgRef == NO_REF)
    dispatchSetResData(dataMsg, dispatch);
  else 
    dispatchSetMsgData(dataMsg, dispatch);
  
  
  /* 22-May-91: fedor: NOTE: class and classData will change if this
     is a previously created dispatch. This may be undesired for
     behavior for a x_ipc_sendResponse call that refers to a previously
     created dispatch. */
  /*  3-Jul-91: reid: Clean up previous class data, 
      except for command class data, which is stored in blockCom */
  if (dispatch->classData && dispatch->msg_class != CommandClass) 
    x_ipc_classDataFree(dispatch->msg_class, dispatch->classData);

  /* RGS 1/11/01: This prevents a reply from being sent when it shouldn't be.
     The problem is that with IPC, one can have a message sent to a query
     handler without expecting a reply (e.g, using a broadcast rather than
     a QueryClass). */
  if (msg_class == ReplyClass && 
      (dispatch->msg_class != QueryClass &&
       dispatch->msg_class != MultiQueryClass)) {
    msg_class = SuccessClass;
  }

  dispatch->msg_class = msg_class;
  dispatch->classData = classData;
  
  recvMessage(dispatch, msg_class, classData);
}