/* * Delete message buffer */ SYSCALL ER _tk_del_mbf( ID mbfid ) { MBFCB *mbfcb; VB *msgbuf = NULL; ER ercd = E_OK; CHECK_MBFID(mbfid); mbfcb = get_mbfcb(mbfid); BEGIN_CRITICAL_SECTION; if ( mbfcb->mbfid == 0 ) { ercd = E_NOEXS; } else { msgbuf = mbfcb->buffer; /* Release wait state of task (E_DLT) */ wait_delete(&mbfcb->recv_queue); wait_delete(&mbfcb->send_queue); /* Return to FreeQue */ QueInsert(&mbfcb->send_queue, &free_mbfcb); mbfcb->mbfid = 0; } END_CRITICAL_SECTION; if ( msgbuf != NULL ) { Ifree(msgbuf); } return ercd; }
/* * Delete rendezvous port */ SYSCALL ER _tk_del_por( 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) */ wait_delete(&porcb->call_queue); wait_delete(&porcb->accept_queue); /* Return to FreeQue */ QueInsert(&porcb->call_queue, &free_porcb); porcb->porid = 0; } END_CRITICAL_SECTION; return ercd; }
/* * Delete mutex */ SYSCALL ER _tk_del_mtx( 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 ) { release_mutex(mtxcb->mtxtsk, mtxcb); } /* Free wait state of task (E_DLT) */ wait_delete(&mtxcb->wait_queue); /* Return to FreeQue */ QueInsert(&mtxcb->wait_queue, &free_mtxcb); mtxcb->mtxid = 0; } END_CRITICAL_SECTION; return ercd; }
/* * Delete variable size memory pool */ SYSCALL ER _tk_del_mpl( ID mplid ) { MPLCB *mplcb; void *mempool = NULL; ATR memattr = 0; ER ercd = E_OK; CHECK_MPLID(mplid); CHECK_DISPATCH(); mplcb = get_mplcb(mplid); BEGIN_CRITICAL_SECTION; if ( mplcb->mplid == 0 ) { ercd = E_NOEXS; } else { mempool = mplcb->areaque.next; memattr = mplcb->mplatr; /* Free wait state of task (E_DLT) */ wait_delete(&mplcb->wait_queue); /* Return to FreeQue */ QueInsert(&mplcb->wait_queue, &free_mplcb); mplcb->mplid = 0; } END_CRITICAL_SECTION; if ( ercd == E_OK ) { IAfree(mempool, memattr); } return ercd; }
/* * Delete mailbox */ SYSCALL ER _tk_del_mbx( ID mbxid ) { MBXCB *mbxcb; ER ercd = E_OK; CHECK_MBXID(mbxid); mbxcb = get_mbxcb(mbxid); BEGIN_CRITICAL_SECTION; if ( mbxcb->mbxid == 0 ) { ercd = E_NOEXS; } else { /* Release wait state of task (E_DLT) */ wait_delete(&mbxcb->wait_queue); /* Return to FreeQue */ QueInsert(&mbxcb->wait_queue, &free_mbxcb); mbxcb->mbxid = 0; } END_CRITICAL_SECTION; return ercd; }