/* * Finalization sequence of device input/output-related */ EXPORT ER finishDevIO( void ) { /* Delete each table */ if ( OpnCBtbl != NULL ) { Ifree(OpnCBtbl); OpnCBtbl = NULL; } if ( ReqCBtbl != NULL ) { Ifree(ReqCBtbl); ReqCBtbl = NULL; } return E_OK; }
/* * 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; }
/* * Finalization sequence of system management */ EXPORT ER finish_devmgr( void ) { ER ercd; /* Unregister subsystem */ ercd = tk_def_ssy(DEVICE_SVC, NULL); #ifdef DEBUG if ( ercd < E_OK ) { extension_printf(("1. finish_devmgr -> tk_def_ssy ercd = %d\n", ercd)); } #endif /* Unregister device initial setting information */ ercd = delIDev(); #ifdef DEBUG if ( ercd < E_OK ) { extension_printf(("2. finish_devmgr -> delIDev ercd = %d\n", ercd)); } #endif /* Finalization sequence of device input/output-related */ ercd = finishDevIO(); #ifdef DEBUG if ( ercd < E_OK ) { extension_printf(("3. finish_devmgr -> finishDevIO ercd = %d\n", ercd)); } #endif /* Delete device registration information table */ if ( DevCBtbl != NULL ) { Ifree(DevCBtbl); DevCBtbl = NULL; } /* Delete semaphore for device management synchronous control */ if ( DevMgrSync > 0 ) { tk_del_sem(DevMgrSync); DevMgrSync = 0; } /* Delete lock for device management exclusive control */ DeleteMLock(&DevMgrLock); return ercd; }
/* * Create message buffer */ SYSCALL ID _tk_cre_mbf( CONST T_CMBF *pk_cmbf ) { #if CHK_RSATR const ATR VALID_MBFATR = { TA_TPRI |TA_NODISWAI #if USE_OBJECT_NAME |TA_DSNAME #endif }; #endif MBFCB *mbfcb; ID mbfid; INT bufsz; VB *msgbuf; ER ercd; CHECK_RSATR(pk_cmbf->mbfatr, VALID_MBFATR); CHECK_PAR(pk_cmbf->bufsz >= 0); CHECK_PAR(pk_cmbf->maxmsz > 0); bufsz = (INT)ROUNDSZ(pk_cmbf->bufsz); if ( bufsz > 0 ) { msgbuf = Imalloc((UINT)bufsz); if ( msgbuf == NULL ) { return E_NOMEM; } } else { msgbuf = NULL; } BEGIN_CRITICAL_SECTION; /* Get control block from FreeQue */ mbfcb = (MBFCB*)QueRemoveNext(&free_mbfcb); if ( mbfcb == NULL ) { ercd = E_LIMIT; } else { mbfid = ID_MBF(mbfcb - mbfcb_table); /* Initialize control block */ QueInit(&mbfcb->send_queue); mbfcb->mbfid = mbfid; mbfcb->exinf = pk_cmbf->exinf; mbfcb->mbfatr = pk_cmbf->mbfatr; QueInit(&mbfcb->recv_queue); mbfcb->buffer = msgbuf; mbfcb->bufsz = mbfcb->frbufsz = bufsz; mbfcb->maxmsz = pk_cmbf->maxmsz; mbfcb->head = mbfcb->tail = 0; #if USE_OBJECT_NAME if ( (pk_cmbf->mbfatr & TA_DSNAME) != 0 ) { strncpy((char*)mbfcb->name, (char*)pk_cmbf->dsname, OBJECT_NAME_LENGTH); } #endif ercd = mbfid; } END_CRITICAL_SECTION; if ( ercd < E_OK && msgbuf != NULL ) { Ifree(msgbuf); } return ercd; }