コード例 #1
0
ファイル: deviceio.c プロジェクト: accordo/tkernel_source
/*
 * 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;
}
コード例 #2
0
ファイル: messagebuf.c プロジェクト: Ninals-GitHub/TRON
/*
 * 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;
}
コード例 #3
0
/*
 * 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;
}
コード例 #4
0
ファイル: messagebuf.c プロジェクト: Ninals-GitHub/TRON
/*
 * 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;
}