void LWP_ThreadSignal(lwpq_t thequeue) { tqueue_st *tq; tq = __lwp_tqueue_open(thequeue); if(!tq) return; __lwp_threadqueue_dequeue(&tq->tqueue); __lwp_thread_dispatchenable(); }
void LWP_ThreadBroadcast(lwpq_t thequeue) { tqueue_st *tq; lwp_cntrl *thethread; tq = __lwp_tqueue_open(thequeue); if(!tq) return; do { thethread = __lwp_threadqueue_dequeue(&tq->tqueue); } while(thethread); __lwp_thread_dispatchenable(); }
void LWP_CloseQueue(lwpq_t thequeue) { lwp_cntrl *thethread; tqueue_st *tq = (tqueue_st*)thequeue; tq = __lwp_tqueue_open(thequeue); if(!tq) return; do { thethread = __lwp_threadqueue_dequeue(&tq->tqueue); } while(thethread); __lwp_thread_dispatchenable(); __lwp_tqueue_free(tq); return; }
s32 LWP_ThreadSleep(lwpq_t thequeue) { u32 level; tqueue_st *tq; lwp_cntrl *exec = NULL; tq = __lwp_tqueue_open(thequeue); if(!tq) return -1; exec = _thr_executing; _CPU_ISR_Disable(level); __lwp_threadqueue_csenter(&tq->tqueue); exec->wait.ret_code = 0; exec->wait.ret_arg = NULL; exec->wait.ret_arg_1 = NULL; exec->wait.queue = &tq->tqueue; exec->wait.id = thequeue; _CPU_ISR_Restore(level); __lwp_threadqueue_enqueue(&tq->tqueue,LWP_THREADQ_NOTIMEOUT); __lwp_thread_dispatchenable(); return 0; }