static void *start_sem_wait(void *arg) { wait_cancel(arg); sem_wait(&sem2); seqno = 2; return 0; }
/* * Task finalization * Call from critical section */ LOCAL void _ter_tsk( TCB *tcb ) { TSTAT state; if ( tcb->svclocked != NULL ) { /* Unlock all extended SVC locks */ AllUnlockSVC(tcb); } state = (TSTAT)tcb->state; if ( state == TS_READY ) { make_non_ready(tcb); } else if ( (state & TS_WAIT) != 0 ) { wait_cancel(tcb); if ( tcb->wspec->rel_wai_hook != NULL ) { (*tcb->wspec->rel_wai_hook)(tcb); } } #ifdef NUM_MTXID /* signal mutex */ signal_all_mutex(tcb); #endif cleanup_context(tcb); }
BOOL wait_release(TCB *tcb) { wait_cancel(tcb); tcb->winfo->wercd = E_RLWAI; return(make_non_wait(tcb)); }
SYSCALL ER ter_tsk(ID tskid) { TCB *tcb; UINT tstat; ER ercd; LOG_TER_TSK_ENTER(tskid); CHECK_TSKCTX_UNL(); CHECK_TSKID(tskid); tcb = get_tcb(tskid); CHECK_NONSELF(tcb); t_lock_cpu(); if (TSTAT_DORMANT(tstat = tcb->tstat)) { ercd = E_OBJ; } else { if (TSTAT_RUNNABLE(tstat)) { make_non_runnable(tcb); } else if (TSTAT_WAITING(tstat)) { wait_cancel(tcb); } make_dormant(tcb); if (tcb->actcnt) { tcb->actcnt = FALSE; if (make_active(tcb)) { dispatch(); } } ercd = E_OK; } t_unlock_cpu(); exit: LOG_TER_TSK_LEAVE(ercd); return(ercd); }
static void *start_sem_timedwait(void *arg) { wait_cancel(arg); sem_timedwait(&sem2, &(struct timespec){1, 0});
SYSCALL INT _tk_acp_por_u( ID porid, UINT acpptn, RNO *p_rdvno, void *msg, TMO_U 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; } /* Check rendezvous accept wait disable */ if ( is_diswai((GCB*)porcb, ctxtsk, TTW_ACP) ) { ercd = E_DISWAI; goto error_exit; } /* Receive message */ *p_rdvno = rdvno = gen_rdvno(tcb); cmsgsz = tcb->winfo.cal.cmsgsz; if ( cmsgsz > 0 ) { memcpy(msg, tcb->winfo.cal.msg, (UINT)cmsgsz); } /* Check rendezvous end wait disable */ if ( is_diswai((GCB*)porcb, tcb, TTW_RDV) ) { wait_release_ng(tcb, E_DISWAI); goto error_exit; } wait_cancel(tcb); /* Make the other task at rendezvous end wait state */ tcb->wspec = &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; timer_insert(&tcb->wtmeb, TMO_FEVR, (CBACK)wait_release_tmout, tcb); QueInit(&tcb->tskque); goto error_exit; } /* Check rendezvous accept wait disable */ if ( is_diswai((GCB*)porcb, ctxtsk, TTW_ACP) ) { ercd = E_DISWAI; goto error_exit; } ercd = E_TMOUT; if ( tmout != TMO_POL ) { /* Ready for rendezvous accept wait */ ctxtsk->wspec = &wspec_acp; ctxtsk->wid = porid; ctxtsk->wercd = &ercd; ctxtsk->winfo.acp.acpptn = acpptn; ctxtsk->winfo.acp.msg = msg; ctxtsk->winfo.acp.p_rdvno = p_rdvno; ctxtsk->winfo.acp.p_cmsgsz = &cmsgsz; make_wait(tmout, porcb->poratr); QueInsert(&ctxtsk->tskque, &porcb->accept_queue); } error_exit: END_CRITICAL_SECTION; return ( ercd < E_OK )? ercd: cmsgsz; }