/* * Delete rendezvous port */ SYSCALL ER tk_del_por_impl( ID porid ) { PORCB *porcb; ER ercd = E_OK; CHECK_PORID(porid); CHECK_INTSK(); porcb = get_porcb(porid); BEGIN_CRITICAL_SECTION; if ( porcb->porid == 0 ) { ercd = E_NOEXS; } else { /* Release wait state of task (E_DLT) */ knl_wait_delete(&porcb->call_queue); knl_wait_delete(&porcb->accept_queue); /* Return to FreeQue */ QueInsert(&porcb->call_queue, &knl_free_porcb); porcb->porid = 0; } END_CRITICAL_SECTION; return ercd; }
/* * Delete mutex */ SYSCALL ER tk_del_mtx_impl( ID mtxid ) { MTXCB *mtxcb; ER ercd = E_OK; CHECK_MTXID(mtxid); mtxcb = get_mtxcb(mtxid); BEGIN_CRITICAL_SECTION; if ( mtxcb->mtxid == 0 ) { ercd = E_NOEXS; } else { /* If there is a task that holds mutex to delete, * delete the mutex from the list * and adjust the task priority if necessary. */ if ( mtxcb->mtxtsk != NULL ) { knl_release_mutex(mtxcb->mtxtsk, mtxcb); } /* Free wait state of task (E_DLT) */ knl_wait_delete(&mtxcb->wait_queue); /* Return to FreeQue */ QueInsert(&mtxcb->wait_queue, &knl_free_mtxcb); mtxcb->mtxid = 0; } END_CRITICAL_SECTION; return ercd; }
/* * Delete fixed size memory pool */ SYSCALL ER tk_del_mpf_impl( ID mpfid ) { MPFCB *mpfcb; VP mempool = NULL; ATR memattr = 0; ER ercd = E_OK; CHECK_MPFID(mpfid); CHECK_DISPATCH(); mpfcb = get_mpfcb(mpfid); knl_LockOBJ(&mpfcb->lock); if ( mpfcb->mpfid == 0 ) { ercd = E_NOEXS; } else { DISABLE_INTERRUPT; mempool = mpfcb->mempool; memattr = mpfcb->mpfatr; /* Release wait state of task (E_DLT) */ knl_wait_delete(&mpfcb->wait_queue); /* Return to FreeQue */ QueInsert(&mpfcb->wait_queue, &knl_free_mpfcb); mpfcb->mpfid = 0; ENABLE_INTERRUPT; } knl_UnlockOBJ(&mpfcb->lock); #if USE_IMALLOC if ( (mempool != NULL) && ((memattr & TA_USERBUF) == 0) ) { knl_Ifree(mempool); } #endif return ercd; }
/* * Delete semaphore */ SYSCALL ER tk_del_sem_impl( ID semid ) { SEMCB *semcb; ER ercd = E_OK; CHECK_SEMID(semid); semcb = get_semcb(semid); BEGIN_CRITICAL_SECTION; if ( semcb->semid == 0 ) { ercd = E_NOEXS; } else { /* Release wait state of task (E_DLT) */ knl_wait_delete(&semcb->wait_queue); /* Return to FreeQue */ QueInsert(&semcb->wait_queue, &knl_free_semcb); semcb->semid = 0; } END_CRITICAL_SECTION; return ercd; }
/* * Delete event flag */ SYSCALL ER tk_del_flg_impl( ID flgid ) { FLGCB *flgcb; ER ercd = E_OK; CHECK_FLGID(flgid); flgcb = get_flgcb(flgid); BEGIN_CRITICAL_SECTION; if ( flgcb->flgid == 0 ) { ercd = E_NOEXS; } else { /* Release wait state of task (E_DLT) */ knl_wait_delete(&flgcb->wait_queue); /* Return to FreeQue */ QueInsert(&flgcb->wait_queue, &knl_free_flgcb); flgcb->flgid = 0; } END_CRITICAL_SECTION; return ercd; }