static void task_delete_hook(WIND_TCB * tcb) { if (tcb != main_thread && taskIdCurrent != main_thread) { EventInfo info; VX_COUNTING_SEMAPHORE(signal_mem); info.signal = semCInitialize(signal_mem, SEM_Q_FIFO, 0); info.pid = (UINT32)tcb; post_event(task_delete_event, &info); semTake(info.signal, WAIT_FOREVER); semTerminate(info.signal); } }
void init_contexts_sys_dep(void) { SPIN_LOCK_ISR_INIT(&events_lock, 0); if ((events_signal = semCInitialize(events_signal_mem, SEM_Q_FIFO, 0)) == NULL) { check_error(errno); } vxdbg_clnt_id = vxdbgClntRegister(EVT_BP); if (vxdbg_clnt_id == NULL) { check_error(errno); } context_extension_offset = context_extension(sizeof(ContextExtensionVxWorks)); taskCreateHookAdd((FUNCPTR)task_create_hook); vxdbgHookAdd(vxdbg_clnt_id, EVT_BP, vxdbg_event_hook); vxdbgHookAdd(vxdbg_clnt_id, EVT_TRACE, vxdbg_event_hook); check_error(pthread_create(&events_thread, &pthread_create_attr, event_thread_func, NULL)); add_waitpid_listener(waitpid_listener, NULL); ini_context_pid_hash(); }