/* * Task finalization * Call from critical section */ EXPORT void knl_ter_tsk( TCB *tcb ) { TSTAT state; state = (TSTAT)tcb->state; if ( state == TS_READY ) { knl_make_non_ready(tcb); } else if ( (state & TS_WAIT) != 0 ) { knl_wait_cancel(tcb); if ( tcb->wspec->rel_wai_hook != NULL ) { (*tcb->wspec->rel_wai_hook)(tcb); } } #if CFN_MAX_MTXID > 0 /* signal mutex */ knl_signal_all_mutex(tcb); #endif knl_cleanup_context(tcb); }
/* * Accept rendezvous */ SYSCALL INT tk_acp_por_impl( ID porid, UINT acpptn, RNO *p_rdvno, VP msg, TMO tmout ) { PORCB *porcb; TCB *tcb; QUEUE *queue; RNO rdvno; INT cmsgsz; ER ercd = E_OK; CHECK_PORID(porid); CHECK_PAR(acpptn != 0); CHECK_TMOUT(tmout); CHECK_DISPATCH(); porcb = get_porcb(porid); BEGIN_CRITICAL_SECTION; if ( porcb->porid == 0 ) { ercd = E_NOEXS; goto error_exit; } /* Search call wait task */ queue = porcb->call_queue.next; while ( queue != &porcb->call_queue ) { tcb = (TCB*)queue; queue = queue->next; if ( (acpptn & tcb->winfo.cal.calptn) == 0 ) { continue; } /* Receive message */ *p_rdvno = rdvno = knl_gen_rdvno(tcb); cmsgsz = tcb->winfo.cal.cmsgsz; if ( cmsgsz > 0 ) { memcpy(msg, tcb->winfo.cal.msg, (UINT)cmsgsz); } knl_wait_cancel(tcb); /* Make the other task at rendezvous end wait state */ tcb->wspec = &knl_wspec_rdv; tcb->wid = 0; tcb->winfo.rdv.rdvno = rdvno; tcb->winfo.rdv.msg = tcb->winfo.cal.msg; tcb->winfo.rdv.maxrmsz = porcb->maxrmsz; tcb->winfo.rdv.p_rmsgsz = tcb->winfo.cal.p_rmsgsz; knl_timer_insert(&tcb->wtmeb, TMO_FEVR, (CBACK)knl_wait_release_tmout, tcb); QueInit(&tcb->tskque); goto error_exit; } ercd = E_TMOUT; if ( tmout != TMO_POL ) { /* Ready for rendezvous accept wait */ knl_ctxtsk->wspec = &knl_wspec_acp; knl_ctxtsk->wid = porid; knl_ctxtsk->wercd = &ercd; knl_ctxtsk->winfo.acp.acpptn = acpptn; knl_ctxtsk->winfo.acp.msg = msg; knl_ctxtsk->winfo.acp.p_rdvno = p_rdvno; knl_ctxtsk->winfo.acp.p_cmsgsz = &cmsgsz; knl_make_wait(tmout, porcb->poratr); QueInsert(&knl_ctxtsk->tskque, &porcb->accept_queue); } error_exit: END_CRITICAL_SECTION; return ( ercd < E_OK )? ercd: cmsgsz; }