Int SystemCfg_deleteResources(SystemCfg_Object *obj) { IHeap_Handle heapH; Int status = 0; Log_print1(Diags_ENTRY | Diags_INFO, "--> "FXNN": (obj=0x%x)",(IArg)obj); /* delete opencl buffer heap */ // HeapBufMP_delete(&obj->openclHeapH); /* unregister rcm message heap with MessageQ */ MessageQ_unregisterHeap(SystemCfg_RcmMsgHeapId_CompDev); /* delete rcm message heap instance */ HeapBuf_delete(&obj->rcmHeapH); /* free the rcm message heap storage */ heapH = (IHeap_Handle)SharedRegion_getHeap(0); Memory_free(heapH, obj->rcmHeapBufBase, obj->rcmHeapBufSize); obj->rcmHeapBufBase = NULL; obj->rcmHeapBufSize = 0; Log_print1(Diags_EXIT, "<-- "FXNN": %d", (IArg)status); return(status); }
/* * ======== SystemCfg_closeResources ======== */ Int SystemCfg_closeResources(SystemCfg_Object *obj) { /* unregister rcm message heap with MessageQ */ MessageQ_unregisterHeap(SystemCfg_RcmMsgHeapId_CompDev); /* close rcm heap reference */ HeapBufMP_close(&(obj->rcmHeapH)); return(0); }
/** * Handler for messageq unregisterheap API. * * \param ctp Thread's associated context information. * \param msg The actual devctl() message. * \param ocb OCB associated with client's session. * * \return POSIX errno value. * * \retval EOK Success. * \retval ENOTSUP Unsupported devctl(). */ int syslink_messageq_unregisterheap(resmgr_context_t *ctp, io_devctl_t *msg, syslink_ocb_t *ocb) { MessageQDrv_CmdArgs * cargs = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->i)); MessageQDrv_CmdArgs * out = (MessageQDrv_CmdArgs *) (_DEVCTL_DATA (msg->o)); out->apiStatus = MessageQ_unregisterHeap(cargs->args.unregisterHeap.heapId); if (out->apiStatus >= 0) remove_ocb_res(ocb, DCMD_MESSAGEQ_UNREGISTERHEAP, (int)cargs->args.unregisterHeap.heapId, NULL); return (_RESMGR_PTR (ctp, &msg->o, sizeof (msg->o) + sizeof(MessageQDrv_CmdArgs))); }
/* * ======== procDelete ======== */ static Void procDelete(Processor_Handle proc) { Int16 heapId; Bool unregisterAndDeleteHeap; Log_print1(Diags_ENTRY, "[+E] Processor_delete_d> Enter (proc=0x%x)", (IArg)proc); if (proc == NULL) { goto procDelete_return; } if (proc->hHeap != NULL) { unregisterAndDeleteHeap = FALSE; if (proc->hHeap == defaultHeapH) { if (--defaultHeapRefCount == 0) { /* this is the last one using the default heap */ unregisterAndDeleteHeap = TRUE; } } else { unregisterAndDeleteHeap = TRUE; } if (unregisterAndDeleteHeap) { heapId = proc->heapId; if (heapId != Processor_INVALID) { Log_print1(Diags_USER1, "[+1] Processor_delete_d> " "MessageQ_unregisterHeap(heapId: %d)", (IArg)heapId); if (MessageQ_unregisterHeap(heapId) != MessageQ_S_SUCCESS) { Log_print1(Diags_USER7, "[+7] Processor_delete_d> " "MessageQ_unregisterHeap(heapId: %d) " "failed", heapId); } } /* delete heap used by message queue */ Log_print1(Diags_USER1, "[+1] Processor_delete_d> " "calling HeapBufMP_delete(hHeap: 0x%x)", (IArg)(proc->hHeap)); HeapBufMP_delete(&proc->hHeap); } } procDelete_return: Log_print1(Diags_EXIT, "[+X] Processor_delete_d> return", (IArg)proc); }
Int32 System_ipcMsgQHeapDelete() { Int32 status; MessageQ_unregisterHeap(SYSTEM_IPC_MSGQ_HEAP); { /* close heap */ status = HeapMemMP_close(&gSystem_ipcObj.msgQHeapHndl); UTILS_assert(status==OSA_SOK); } return OSA_SOK; }
Int SystemCfg_deleteResources(SystemCfg_Object *obj) { Int status = 0; Log_print1(Diags_ENTRY | Diags_INFO, "--> "FXNN": (obj=0x%x)",(IArg)obj); /* unregister rcm message heap with MessageQ */ MessageQ_unregisterHeap(SystemCfg_RcmMsgHeapId_CompDev); /* delete rcm message heap instance */ HeapBufMP_delete(&obj->rcmHeapH); Log_print1(Diags_EXIT, "<-- "FXNN": %d", (IArg)status); return(status); }
Void smain(UArg arg0, UArg arg1) { HeapBufMP_Params heapBufMPP; HeapBufMP_Handle heapH = NULL; UInt16 serverProcId; Int status = 0; /* create heap for rcm messages */ HeapBufMP_Params_init(&heapBufMPP); heapBufMPP.name = Global_RcmClientHeapName; heapBufMPP.regionId = 0; heapBufMPP.blockSize = 0x80; /* 128 B */ heapBufMPP.numBlocks = 4; heapH = HeapBufMP_create(&heapBufMPP); if (heapH == NULL) { Log_error0(FXNN": HeapBuf_create() failed"); goto leave; } /* register this heap with MessageQ */ MessageQ_registerHeap((Ptr)heapH, Global_RcmClientHeapId); /* attach to the server processor */ serverProcId = MultiProc_getId(Global_ServerProcName); do { status = Ipc_attach(serverProcId); if (status < 0) { #ifdef __ARCTIC__ Task_yield(); /* no timers on EVE simulator */ #else Task_sleep(10); /* 10ms (when 1 tick == 1 ms) */ #endif } } while (status < 0); /* delay 500ms to give server a chance to boot */ #ifdef __ARCTIC__ Task_yield(); #else Task_sleep(500); #endif /* invoke the application entry point */ App_exec(NULL); leave: /* detach from server processor */ Ipc_detach(serverProcId); /* unregister the heap and delete it */ if (heapH != NULL) { MessageQ_unregisterHeap(Global_RcmClientHeapId); HeapBufMP_delete(&heapH); } /* report if error */ if (status < 0) { System_printf("FAIL: example encountered errors\n"); } return; }
/* * ======== RcmClientCleanup ======== */ Int RcmClientCleanup (Int testCase) { Int status = 0; RcmClient_Message * rcmMsg = NULL; RcmClient_Message * returnMsg = NULL; UInt rcmMsgSize; RCM_Remote_FxnArgs * fxnExitArgs; #if !defined(SYSLINK_USE_DAEMON) ProcMgr_StopParams stopParams; #endif Osal_printf ("\nRcmClientCleanup: Entering RcmClientCleanup()\n"); /* Send terminate message */ /* Allocate a remote command message */ rcmMsgSize = sizeof(RCM_Remote_FxnArgs); status = RcmClient_alloc (rcmClientHandle, rcmMsgSize, &rcmMsg); if (status < 0) { Osal_printf ("RcmClientCleanup: Error allocating RCM message\n"); goto exit; } /* Fill in the remote command message */ rcmMsg->fxnIdx = fxnExitIdx; fxnExitArgs = (RCM_Remote_FxnArgs *)(&rcmMsg->data); fxnExitArgs->a = 0xFFFF; #if !defined(SYSLINK_USE_DAEMON) /* Execute the remote command message */ Osal_printf ("RcmClientCleanup: calling RcmClient_execDpc \n"); status = RcmClient_execDpc (rcmClientHandle, rcmMsg, &returnMsg); if (status < 0) { Osal_printf ("RcmClientCleanup: RcmClient_execDpc error [0x%x]\n", status); goto exit; } #endif /* !defined(SYSLINK_USE_DAEMON) */ /* Return message to the heap */ Osal_printf ("RcmClientCleanup: Calling RcmClient_free \n"); RcmClient_free (rcmClientHandle, returnMsg); /* Delete the rcm client */ Osal_printf ("RcmClientCleanup: Delete RCM client instance \n"); status = RcmClient_delete (&rcmClientHandle); if (status < 0) Osal_printf ("RcmClientCleanup: Error in RCM Client instance delete" " [0x%x]\n", status); else Osal_printf ("RcmClientCleanup: RcmClient_delete status: [0x%x]\n", status); /* Rcm client module destroy */ Osal_printf ("RcmClientCleanup: Destroy RCM client module \n"); RcmClient_exit (); /* Finalize modules */ #if !defined(SYSLINK_USE_DAEMON) // Do not call ProcMgr_stop if using daemon status = MessageQ_unregisterHeap (RCM_MSGQ_HEAPID); if (status < 0) Osal_printf ("RcmClientCleanup: Error in MessageQ_unregisterHeap" " [0x%x]\n", status); else Osal_printf ("RcmClientCleanup: MessageQ_unregisterHeap status:" " [0x%x]\n", status); if (heapHandle) { status = HeapBufMP_delete (&heapHandle); if (status < 0) Osal_printf ("RcmClientCleanup: Error in HeapBufMP_delete [0x%x]\n", status); else Osal_printf ("RcmClientCleanup: HeapBufMP_delete status: [0x%x]\n", status); } if (heapBufPtr) { Memory_free (srHeap, heapBufPtr, heapSize); } stopParams.proc_id = remoteIdClient; if (testCase == 2) { status = ProcMgr_stop(procMgrHandleClient1, &stopParams); if (status < 0) Osal_printf ("RcmClientCleanup: Error in ProcMgr_stop [0x%x]\n", status); else Osal_printf ("RcmClientCleanup: ProcMgr_stop status: [0x%x]\n", status); stopParams.proc_id = MultiProc_getId (SYSM3_PROC_NAME); } status = ProcMgr_stop(procMgrHandleClient, &stopParams); if (status < 0) Osal_printf ("RcmClientCleanup: Error in ProcMgr_stop [0x%x]\n", status); else Osal_printf ("RcmClientCleanup: ProcMgr_stop status: [0x%x]\n", status); #endif if (testCase == 2) { status = ProcMgr_detach (procMgrHandleClient1); Osal_printf ("RcmClientCleanup: ProcMgr_detach status [0x%x]\n", status); status = ProcMgr_close (&procMgrHandleClient1); if (status < 0) Osal_printf ("RcmClientCleanup: Error in ProcMgr_close [0x%x]\n", status); else Osal_printf ("RcmClientCleanup: ProcMgr_close status: [0x%x]\n", status); } status = ProcMgr_detach (procMgrHandleClient); Osal_printf ("RcmClientCleanup: ProcMgr_detach status [0x%x]\n", status); status = ProcMgr_close (&procMgrHandleClient); if (status < 0) Osal_printf ("RcmClientCleanup: Error in ProcMgr_close [0x%x]\n", status); else Osal_printf ("RcmClientCleanup: ProcMgr_close status: [0x%x]\n", status); status = Ipc_destroy (); if (status < 0) Osal_printf("RcmClientCleanup: Error in Ipc_destroy [0x%x]\n", status); else Osal_printf("RcmClientCleanup: Ipc_destroy status: [0x%x]\n", status); exit: Osal_printf ("RcmClientCleanup: Leaving RcmClientCleanup()\n"); return status; }
/* * ======== App_delete ======== * * 1. send shutdown event * 2. wait for shutdown acknowledgement event * * 3. close remote resources * 4. send close done event * 5. wait for remote close done event * * 6. delete shared resoures * 7. send disconnect event (last sent event) * 8. wait for disconnect event * * 9. unregister notify callback * 10. delete sync object */ Int App_delete(Void) { Int status; UInt32 event; /* 1. send shutdown command (out-of-band) */ status = Notify_sendEvent(Module.remoteProcId, Module.lineId, Module.eventId, App_CMD_SHUTDOWN, TRUE); if (status < 0) { goto leave; } /* 2. wait for shutdown acknowledgement */ do { event = App_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_SDACK); /* 3. close remote resources */ status = MessageQ_close(&Module.videoQue); if (status < 0) { goto leave; } /* 4. send close done event */ status = Notify_sendEvent(Module.remoteProcId, Module.lineId, Module.eventId, App_CMD_CLOSED, TRUE); if (status < 0) { goto leave; } /* 5. wait for remote close done event */ do { event = App_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_CLOSED); /* 6. delete shared resoures */ /* delete the host message queue */ status = MessageQ_delete(&Module.hostQue); if (status < 0) { goto leave; } /* unregister heap with MessageQ */ status = MessageQ_unregisterHeap(App_MsgHeapId); if (status < 0) { goto leave; } /* delete the message heap */ status = HeapBufMP_delete(&Module.msgHeap); if (status < 0) { goto leave; } /* 7. send disconnect event (last sent event) */ status = Notify_sendEvent(Module.remoteProcId, Module.lineId, Module.eventId, App_CMD_DONE, TRUE); if (status < 0) { goto leave; } /* 8. wait for disconnect event (last event received) */ do { event = App_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_DONE); /* 9. unregister notify callback */ status = Notify_unregisterEventSingle(Module.remoteProcId, Module.lineId, Module.eventId); if (status < 0) { goto leave; } /* 10. delete sync object */ sem_destroy(&Module.semH); leave: return(status); }
Int SystemCfg_deleteLocalResources(Void) { Error_Block eb; Int status = 0; struct SystemCfg *stateObj = &SystemCfg_State; Log_print1(Diags_ENTRY, "--> %s: ()", (IArg)FXNN); Error_init(&eb); /* unregister heap with MessageQ */ MessageQ_unregisterHeap(Global_TilerHeapId); /* delete heap used for rcm message queue */ HeapBufMP_delete(&stateObj->heapH); /* send done event to remote core */ Log_print0(Diags_USER1, FXNN": send done event to remote core"); status = Notify_sendEvent(stateObj->hostProcId, Global_NotifyLineId, Global_HostDspEvtNum, Global_EvtDone, TRUE); if (status < 0) { /* Log_error() */ Log_print4(Diags_USER8, "Error: %s, line %d: %s: Notify_sendEvent() returned error %d", (IArg)__FILE__, (IArg)__LINE__, (IArg)FXNN, (IArg)status); goto leave; } /* wait for done event from remote core */ Log_print0(Diags_USER1, FXNN": waiting for done event..."); SemThread_pend(stateObj->semH, SemThread_FOREVER, &eb); if (Error_check(&eb)) { /* Log_error() */ Log_print3(Diags_USER8, "Error: %s, line %d: %s: SemThread_pend() returned with error", (IArg)__FILE__, (IArg)__LINE__, (IArg)FXNN); status = -1; goto leave; } Log_print0(Diags_USER1, FXNN": ...received done event"); /* unregister notify callback */ status = Notify_unregisterEvent(stateObj->hostProcId, Global_NotifyLineId, Global_HostDspEvtNum, SystemCfg_notifyCB__P, (UArg)stateObj); if (status < 0) { /* Log_error() */ Log_print4(Diags_USER8, "Error: %s, line %d: %s: " "Notify_unregisterEventSingle() returned error %d", (IArg)__FILE__, (IArg)__LINE__, (IArg)FXNN, (IArg)status); goto leave; } /* delete sync object */ if (stateObj->semH != NULL) { SemThread_destruct(&stateObj->semObj); stateObj->semH = NULL; } leave: Log_print2(Diags_EXIT, "<-- %s: %d", (IArg)FXNN, (IArg)status); return(status); }
/* * ======== Hello_stop ======== * * 1. send shutdown event * 2. wait for shutdown acknowledgement * 3. close remote resources * 4. handshake close event * 5. delete shared resoures * 6. send disconnect event (last event sent) * 7. wait for disconnect event * 8. unregister notify callback * 9. delete semaphore object */ Int Hello_stop(Void) { Int status; UInt32 event; /* * 1. send shutdown command (out-of-band) */ status = Notify_sendEvent(Module.remoteProcId, Module.lineId, Module.eventId, App_CMD_SHUTDOWN, TRUE); if (status < 0) { goto leave; } /* * 2. wait for shutdown acknowledgement */ do { event = Hello_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_SDACK); /* * 3. close remote resources */ /* * 4. handshake close event */ status = Notify_sendEvent(Module.remoteProcId, Module.lineId, Module.eventId, App_CMD_CLOSED, TRUE); if (status < 0) { goto leave; } do { event = Hello_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_CLOSED); /* * 5. delete shared resoures */ /* unregister heap with MessageQ */ status = MessageQ_unregisterHeap(Global_RcmClientHeapId); if (status < 0) { goto leave; } /* delete the message heap */ status = HeapBufMP_delete(&Module.msgHeap); if (status < 0) { goto leave; } /* * 6. send disconnect event (last event sent) */ status = Notify_sendEvent(Module.remoteProcId, Module.lineId, Module.eventId, App_CMD_DONE, TRUE); if (status < 0) { goto leave; } /* * 7. wait for disconnect event (last event received) */ do { event = Hello_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_DONE); /* * 8. unregister notify callback */ status = Notify_unregisterEventSingle(Module.remoteProcId, Module.lineId, Module.eventId); if (status < 0) { goto leave; } /* * 9. delete semaphore object */ SemThread_destruct(&Module.semS); leave: return(status); }
/* * ======== ipc_cleanup ======== */ static Void ipcCleanup (Void) { ProcMgr_StopParams stopParams; Int status = 0; /* Cleanup the default HeapBufMP registered with MessageQ */ status = MessageQ_unregisterHeap (RCM_MSGQ_DOMX_HEAPID); if (status < 0) { Osal_printf ("Error in MessageQ_unregisterHeap [0x%x]\n", status); } if (heapHandle1) { status = HeapBufMP_delete (&heapHandle1); if (status < 0) { Osal_printf ("Error in HeapBufMP_delete [0x%x]\n", status); } } if (heapBufPtr1) { Memory_free (srHeap, heapBufPtr1, heapSize1); } status = MessageQ_unregisterHeap (RCM_MSGQ_TILER_HEAPID); if (status < 0) { Osal_printf ("Error in MessageQ_unregisterHeap [0x%x]\n", status); } if (heapHandle) { status = HeapBufMP_delete (&heapHandle); if (status < 0) { Osal_printf ("Error in HeapBufMP_delete [0x%x]\n", status); } } if (heapBufPtr) { Memory_free (srHeap, heapBufPtr, heapSize); } status = ProcMgr_deleteDMMPool (DUCATI_DMM_POOL_0_ID, remoteIdSysM3); if (status < 0) { Osal_printf ("Error in ProcMgr_deleteDMMPool:status = 0x%x\n", status); } if(appM3Client) { stopParams.proc_id = remoteIdAppM3; status = ProcMgr_stop (procMgrHandleAppM3, &stopParams); if (status < 0) { Osal_printf ("Error in ProcMgr_stop(%d): status = 0x%x\n", stopParams.proc_id, status); } #if defined(SYSLINK_USE_LOADER) status = ProcMgr_unload (procMgrHandleAppM3, fileIdAppM3); if(status < 0) { Osal_printf ("Error in ProcMgr_unload, status [0x%x]\n", status); } #endif } stopParams.proc_id = remoteIdSysM3; status = ProcMgr_stop (procMgrHandleSysM3, &stopParams); if (status < 0) { Osal_printf ("Error in ProcMgr_stop(%d): status = 0x%x\n", stopParams.proc_id, status); } #if defined(SYSLINK_USE_LOADER) status = ProcMgr_unload (procMgrHandleSysM3, fileIdSysM3); if(status < 0) { Osal_printf ("Error in ProcMgr_unload, status [0x%x]\n", status); } #endif if(appM3Client) { status = ProcMgr_detach (procMgrHandleAppM3); if (status < 0) { Osal_printf ("Error in ProcMgr_detach(AppM3): status = 0x%x\n", status); } status = ProcMgr_close (&procMgrHandleAppM3); if (status < 0) { Osal_printf ("Error in ProcMgr_close(AppM3): status = 0x%x\n", status); } } status = ProcMgr_detach (procMgrHandleSysM3); if (status < 0) { Osal_printf ("Error in ProcMgr_detach(SysM3): status = 0x%x\n", status); } status = ProcMgr_close (&procMgrHandleSysM3); if (status < 0) { Osal_printf ("Error in ProcMgr_close(SysM3): status = 0x%x\n", status); } status = Ipc_destroy (); if (status < 0) { Osal_printf ("Error in Ipc_destroy: status = 0x%x\n", status); } Osal_printf ("Done cleaning up ipc!\n\n"); }
/* * ======== RcmServerCleanup ======== */ Int RcmServerCleanup (Int testCase) { Int status = 0; #if !defined(SYSLINK_USE_DAEMON) ProcMgr_StopParams stopParams; #endif Osal_printf ("\nRcmServerCleanup: Entering RcmServerCleanup()\n"); /* Delete the rcm server */ Osal_printf ("RcmServerCleanup: Delete RCM server instance \n"); status = RcmServer_delete (&rcmServerHandle); if (status < 0) Osal_printf ("RcmServerCleanup: Error in RCM Server instance delete" " [0x%x]\n", status); else Osal_printf ("RcmServerCleanup: RcmServer_delete status: [0x%x]\n", status); /* Rcm server module destroy */ Osal_printf ("RcmServerCleanup: Clean up RCM server module \n"); RcmServer_exit (); /* Finalize modules */ #if !defined(SYSLINK_USE_DAEMON) // Do not call ProcMgr_stop if using daemon status = MessageQ_unregisterHeap (RCM_MSGQ_HEAPID); if (status < 0) Osal_printf ("RcmServerCleanup: Error in MessageQ_unregisterHeap" " [0x%x]\n", status); else Osal_printf ("RcmServerCleanup: MessageQ_unregisterHeap status:" " [0x%x]\n", status); if (heapHandleServer) { status = HeapBufMP_delete (&heapHandleServer); if (status < 0) Osal_printf ("RcmServerCleanup: Error in HeapBufMP_delete [0x%x]\n", status); else Osal_printf ("RcmServerCleanup: HeapBufMP_delete status: [0x%x]\n", status); } if (heapBufPtrServer) { Memory_free (srHeapServer, heapBufPtrServer, heapSizeServer); } stopParams.proc_id = remoteIdServer; if (testCase == 2) { status = ProcMgr_stop (procMgrHandleServer1, &stopParams); if (status < 0) Osal_printf ("RcmServerCleanup: Error in ProcMgr_stop [0x%x]\n", status); else Osal_printf ("RcmServerCleanup: ProcMgr_stop status: [0x%x]\n", status); stopParams.proc_id = MultiProc_getId (SYSM3_PROC_NAME); } status = ProcMgr_stop (procMgrHandleServer, &stopParams); if (status < 0) Osal_printf ("RcmServerCleanup: Error in ProcMgr_stop [0x%x]\n", status); else Osal_printf ("RcmServerCleanup: ProcMgr_stop status: [0x%x]\n", status); #endif if (testCase == 2) { status = ProcMgr_detach (procMgrHandleServer1); Osal_printf ("RcmServerCleanup: ProcMgr_detach status [0x%x]\n", status); status = ProcMgr_close (&procMgrHandleServer1); if (status < 0) Osal_printf ("RcmServerCleanup: Error in ProcMgr_close [0x%x]\n", status); else Osal_printf ("RcmServerCleanup: ProcMgr_close status: [0x%x]\n", status); } status = ProcMgr_detach (procMgrHandleServer); Osal_printf ("RcmServerCleanup: ProcMgr_detach status [0x%x]\n", status); status = ProcMgr_close (&procMgrHandleServer); if (status < 0) Osal_printf ("RcmServerCleanup: Error in ProcMgr_close [0x%x]\n", status); else Osal_printf ("RcmServerCleanup: ProcMgr_close status: [0x%x]\n", status); status = Ipc_destroy (); if (status < 0) Osal_printf ("RcmServerCleanup: Error in Ipc_destroy [0x%x]\n", status); else Osal_printf ("RcmServerCleanup: Ipc_destroy status: [0x%x]\n", status); Osal_printf ("RcmServerCleanup: Leaving RcmServerCleanup()\n"); return status; }
/* * ======== procDelete ======== */ static Void procDelete(Processor_Handle proc) { Int status = 0; Int16 heapId; Bool unregisterAndDeleteHeap; ProcMgr_AddrInfo CMEMAddrInfo; CMEM_BlockAttrs cmemBlockAttrs; Int blockNum; Int nCMEMBlocks; Log_print1(Diags_ENTRY, "[+E] Processor_delete_d> Enter (proc=0x%x)", (IArg)proc); if (proc == NULL) { goto procDelete_return; } /* close tranport and stop DSP, detach, destroy */ /* unregister this heap with MessageQ */ if (proc->startCallBackStatus >= 0) { blockNum = 0; nCMEMBlocks = 0; status = CMEM_getNumBlocks(&nCMEMBlocks); if (status != 0) { Log_print1(Diags_USER2, "[+2] Processor_delete_d> " "CMEM_getNumBlocks() failed: %d", status); } while (blockNum < nCMEMBlocks) { status = CMEM_getBlockAttrs(blockNum, &cmemBlockAttrs); if (status != 0) { Log_print2(Diags_USER7, "[+7] Processor_delete_d> " "CMEM_getBlockAttrs(%d) failed: %d", blockNum, status); goto cmemDone; } CMEMAddrInfo.addr[ProcMgr_AddrType_MasterPhys] = cmemBlockAttrs.phys_base; CMEMAddrInfo.addr[ProcMgr_AddrType_SlaveVirt] = cmemBlockAttrs.phys_base; CMEMAddrInfo.size = cmemBlockAttrs.size; CMEMAddrInfo.isCached = FALSE; Log_print3(Diags_USER1, "[+1] Processor_delete_d> CMEM block " "#%d found, doing ProcMgr_unmap(0x%x, 0x%x)...", blockNum, (IArg)cmemBlockAttrs.phys_base, (IArg)cmemBlockAttrs.size); status = ProcMgr_unmap(proc->procMgrH, ProcMgr_SLAVEVIRT, &CMEMAddrInfo, ProcMgr_AddrType_MasterPhys); if (status < 0) { Log_print1(Diags_USER7, "[+7] Processor_delete_d> " "ProcMgr_unmap() failed: %d", status); goto cmemDone; } blockNum++; } cmemDone: Log_print2(Diags_USER7, "[+2] Processor_delete_d> " "defaultHeapH: 0x%x, proc->heapH: 0x%x", (IArg)defaultHeapH, (IArg)proc->heapH); if (proc->heapH != NULL) { unregisterAndDeleteHeap = FALSE; if (proc->heapH == defaultHeapH) { Log_print1(Diags_USER1, "[+1] Processor_delete_d> " "defaultHeapRefCount = %d", (IArg)defaultHeapRefCount); if (--defaultHeapRefCount == 0) { /* this is the last one using the default heap */ unregisterAndDeleteHeap = TRUE; } } else { unregisterAndDeleteHeap = TRUE; } if (unregisterAndDeleteHeap) { heapId = proc->heapId; Log_print1(Diags_USER1, "[+1] Processor_delete_d> " "unregisterAndDeleteHeap, heapId = %d", (IArg)heapId); if (heapId != Processor_INVALID) { Log_print1(Diags_USER1, "[+1] Processor_delete_d> " "MessageQ_unregisterHeap(heapId: %d)", (IArg)heapId); if (MessageQ_unregisterHeap(heapId) !=MessageQ_S_SUCCESS) { Log_print1(Diags_USER7, "[+7] Processor_delete_d> " "MessageQ_unregisterHeap(heapId: %d) failed", heapId); } } /* delete heap used by message queue */ Log_print1(Diags_USER1, "[+1] Processor_delete_d> " "calling HeapBufMP_delete(heapH: 0x%x)", (IArg)(proc->heapH)); HeapBufMP_delete(&proc->heapH); } } /* Stop execution on DSP */ Log_print0(Diags_USER1, "[+2] Processor_delete_d> " "calling Ipc_control(STOPCALLBACK)..."); status = Ipc_control(proc->cpuId, Ipc_CONTROLCMD_STOPCALLBACK, NULL); Log_print2(Diags_USER2, "[+2] Processor_delete_d> " "Ipc_control(STOPCALLBACK) status: 0x%x [%d]", (IArg)status, (IArg)status); } else { Log_print2(Diags_USER2, "[+2] Processor_delete_d> Not calling " "Ipc_control(STOPCALLBACK) because startCallBackStatus = " "0x%x [%d]", (IArg)proc->startCallBackStatus, (IArg)proc->startCallBackStatus); } if (proc->useExtLoader == FALSE) { /* We unload the slave processor */ Log_print0(Diags_USER2, "[+2] Processor_delete_d> Stopping DSP..."); status = ProcMgr_stop(proc->procMgrH); if (status < 0) { Log_print1(Diags_USER6, "[+6] Processor_delete_d> " "Stopping DSP FAILED, status=0x%x", (IArg)status); } if (proc->fileId != 0xffffffff) { Log_print0(Diags_USER2, "[+2] Processor_delete_d> " "Unloading DSP..."); status = ProcMgr_unload(proc->procMgrH, proc->fileId); if (status < 0) { Log_print1(Diags_USER6, "[+6] Processor_delete_d> " "Unloading DSP FAILED, status=0x%x", (IArg)status); } } /* Unmap slave memory */ if (!mapByFile(proc->procMgrH, proc->memMapName, proc->cpuId, FALSE)) { Log_print0(Diags_USER6, "Processor_delete_d> mapByFile() failed!"); } /* Detach from the processor */ Log_print0(Diags_USER1, "[+1] Processor_delete_d> " "calling ProcMgr_detach()..."); status = ProcMgr_detach(proc->procMgrH); if (status < 0) { Log_print1(Diags_USER6, "[+6] Processor_delete_d> " "Detaching from DSP FAILED, status=0x%x", (IArg)status); } } // proc->useExtLoader == FALSE Log_print0(Diags_USER1, "[+1] Processor_delete_d> " "calling ProcMgr_close()..."); status = ProcMgr_close(&proc->procMgrH); if (status < 0) { Log_print1(Diags_USER6, "[+6] Processor_delete_d> " "Closing ProcMgr FAILED, status=0x%x", (IArg)status); } procDelete_return: Log_print0(Diags_EXIT, "[+X] Processor_delete_d> return"); }
/* * ======== Server_finish ======== * * 1. close remote resources * 2. handshake close event * 3. delete shared resoures * 4. send disconnect event (last event sent) * 5. wait for disconnect event * 6. unregister notify callback * 9. delete semaphore object */ Int Server_finish(Void) { Int status; UInt32 event; /* * 1. close remote resources */ /* delete the RcmServer instance */ status = RcmServer_delete(&Module.rcmServerH); if (status < 0) { Log_error1("Server_finish: RcmServer_delete() returned error %d", (IArg)status); goto leave; } /* unregister rcm heap with MessageQ */ status = MessageQ_unregisterHeap(Global_RcmClientHeapId); if (status < 0) { goto leave; } /* close the rcm heap */ status = HeapBufMP_close(&Module.heapH); if (status < 0) { Log_error1("Server_finish: HeapBufMP_close() returned error %d", (IArg)status); goto leave; } /* * 2. handshake close event */ status = Notify_sendEvent(Module.hostProcId, Module.lineId, Module.eventId, App_CMD_CLOSED, TRUE); if (status < 0) { goto leave; } do { event = Server_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_CLOSED); /* * 3. delete shared resoures */ /* * 4. send disconnect event (last event sent) */ status = Notify_sendEvent(Module.hostProcId, Module.lineId, Module.eventId, App_CMD_DONE, TRUE); if (status < 0) { goto leave; } /* * 5. wait for disconnect event (last event received) */ do { event = Server_waitForEvent(); if (event >= App_E_FAILURE) { status = -1; goto leave; } } while (event != App_CMD_DONE); /* * 6. unregister notify callback */ status = Notify_unregisterEventSingle(Module.hostProcId, Module.lineId, Module.eventId); if (status < 0) { goto leave; } /* * 9. delete semaphore object */ Semaphore_destruct(&Module.semS); Module.semH = NULL; leave: return(status); }