/* * ======== taskLoad ======== */ Void task(UArg arg1, UArg arg2) { UInt count = 1; Int status = Ipc_S_SUCCESS; UInt16 remoteProcId = MultiProc_getId("HOST"); do { status = Ipc_attach(remoteProcId); } while (status < 0); Notify_registerEvent(remoteProcId, 0, SHUTDOWN, (Notify_FnNotifyCbck)notifyCallbackFxn, 0); while (shutdownFlag == FALSE) { Semaphore_pend(sem, BIOS_WAIT_FOREVER); /* Benchmark how long it takes to flip all the bits */ Log_write1(UIABenchmark_start, (xdc_IArg)"Reverse"); reverseBits(buffer, sizeof(buffer)); Log_write1(UIABenchmark_stop, (xdc_IArg)"Reverse"); Log_print1(Diags_USER1, "count = %d", count++); } /* Start shutdown process */ Notify_unregisterEvent(remoteProcId, 0, SHUTDOWN, (Notify_FnNotifyCbck)notifyCallbackFxn, 0); do { status = Ipc_detach(remoteProcId); } while (status < 0); Ipc_stop(); }
Int SystemCfg_detachHook(UArg userCtx, UInt16 remoteProcId) { Int status; List_Elem * elem = NULL; SystemCfg_Object * obj = NULL; IArg key; /* find object on module list */ key = GateH_enter(Mod_gate); while ((elem = List_next(Mod_objList, elem)) != NULL) { obj = (SystemCfg_Object *)elem; if (obj->remoteProcId == remoteProcId) { break; } obj = NULL; } GateH_leave(Mod_gate, key); if (obj != NULL) { status = Notify_unregisterEvent(remoteProcId, SystemCfg_NotifyLineId, SystemCfg_HostDspEvtNum, SystemCfg_notifyCB, (UArg)obj); if (status < 0) { Log_error1(FXNN": Notify_unregisterEvent() error %d", (IArg)status); } } return(status); }
Int32 System_ipcNotifyDeInit() { Int32 status; UInt32 i, procId; Vps_printf(" %d: SYSTEM: IPC Notify de-init in progress !!!\n", Utils_getCurTimeInMsec()); i = 0; while (gSystem_ipcEnableProcId[i] != SYSTEM_PROC_MAX) { procId = gSystem_ipcEnableProcId[i]; if ((procId != System_getSelfProcId()) && (procId != SYSTEM_PROC_INVALID)) { status = Notify_unregisterEvent(procId, SYSTEM_IPC_NOTIFY_LINE_ID, SYSTEM_IPC_NOTIFY_EVENT_ID, System_ipcNotifyHandler, NULL); UTILS_assert(status == Notify_S_SUCCESS); } i++; } Vps_printf(" %d: SYSTEM: IPC Notify de-init DONE !!!\n", Utils_getCurTimeInMsec()); return status; }
/* * ======== main ======== */ Int main(Int argc, Char* argv[]) { UInt32 myArg1 = 12345; UInt32 myArg2 = 67890; UInt16 myProcId = MultiProc_self(); Int status; /* Register the functions to be called */ System_printf("Registering myFxn1 & myArg1 to event #%d..\n", EVENT); Notify_registerEvent(myProcId, 0, EVENT, (Notify_FnNotifyCbck)myFxn1, (UArg)&myArg1); System_printf("Registering myFxn2 & myArg2 to event #%d..\n", EVENT); Notify_registerEvent(myProcId, 0, EVENT, (Notify_FnNotifyCbck)myFxn2, (UArg)&myArg2); /* Send an event */ System_printf("Sending event #%d (myFxn1 and myFxn2 should run)\n", EVENT); Notify_sendEvent(myProcId, 0, EVENT, 0xaaaaa, TRUE); /* Unregister one of the functions */ System_printf("Unregistering myFxn1 + myArg1\n"); status = Notify_unregisterEvent(myProcId, 0, EVENT, (Notify_FnNotifyCbck)myFxn1, (UArg)&myArg1); if (status < 0) { System_abort("Listener not found! (THIS IS UNEXPECTED)\n"); } /* Send an event */ System_printf("Sending event #%d (myFxn2 should run)\n", EVENT); Notify_sendEvent(myProcId, 0, EVENT, 0xbbbbb, TRUE); /* Disable event */ System_printf("Disabling event #%d:\n", EVENT); Notify_disableEvent(myProcId, 0, EVENT); /* Send an event (nothing should happen) */ System_printf("Sending event #%d (nothing should happen)\n", EVENT); Notify_sendEvent(myProcId, 0, EVENT, 0xbbbbb, TRUE); /* Enable event */ System_printf("Enabling event #%d:\n", EVENT); Notify_enableEvent(myProcId, 0, EVENT); /* Send an event */ System_printf("Sending event #%d (myFxn2 should run)\n", EVENT); Notify_sendEvent(myProcId, 0, EVENT, 0xbbbbb, TRUE); System_printf("Test completed\n"); return (0); }
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); }