/* * Get memory */ EXPORT void* knl_Icalloc( size_t nmemb, size_t size ) { size_t sz = nmemb * size; void *mem; mem = knl_Imalloc(sz); if ( mem == NULL ) { return NULL; } memset(mem, 0, sz); return mem; }
/* * Create fixed size memory pool */ SYSCALL ID tk_cre_mpf_impl( T_CMPF *pk_cmpf ) { #if CHK_RSATR const ATR VALID_MPFATR = { TA_TPRI |TA_RNG3 |TA_USERBUF #if USE_OBJECT_NAME |TA_DSNAME #endif }; #endif MPFCB *mpfcb; ID mpfid; W blfsz, mpfsz; VP mempool; CHECK_RSATR(pk_cmpf->mpfatr, VALID_MPFATR); CHECK_PAR(pk_cmpf->mpfcnt > 0); CHECK_PAR(pk_cmpf->blfsz > 0); #if !USE_IMALLOC /* TA_USERBUF must be specified if configured in no Imalloc */ CHECK_PAR((pk_cmpf->mpfatr & TA_USERBUF) != 0); #endif CHECK_DISPATCH(); blfsz = (W)MINSZ(pk_cmpf->blfsz); mpfsz = blfsz * pk_cmpf->mpfcnt; #if USE_IMALLOC if ( (pk_cmpf->mpfatr & TA_USERBUF) != 0 ) { /* Size of user buffer must be multiples of sizeof(FREEL) */ if ( blfsz != pk_cmpf->blfsz ) { return E_PAR; } /* Use user buffer */ mempool = pk_cmpf->bufptr; } else { /* Allocate memory for memory pool */ mempool = knl_Imalloc((UW)mpfsz); if ( mempool == NULL ) { return E_NOMEM; } } #else /* Size of user buffer must be larger than sizeof(FREEL) */ if ( blfsz != pk_cmpf->blfsz ) { return E_PAR; } /* Use user buffer */ mempool = pk_cmpf->bufptr; #endif /* Get control block from FreeQue */ DISABLE_INTERRUPT; mpfcb = (MPFCB*)QueRemoveNext(&knl_free_mpfcb); ENABLE_INTERRUPT; if ( mpfcb == NULL ) { #if USE_IMALLOC if ( (pk_cmpf->mpfatr & TA_USERBUF) == 0 ) { knl_Ifree(mempool); } #endif return E_LIMIT; } knl_LockOBJ(&mpfcb->lock); mpfid = ID_MPF(mpfcb - knl_mpfcb_table); /* Initialize control block */ QueInit(&mpfcb->wait_queue); mpfcb->exinf = pk_cmpf->exinf; mpfcb->mpfatr = pk_cmpf->mpfatr; mpfcb->mpfcnt = mpfcb->frbcnt = pk_cmpf->mpfcnt; mpfcb->blfsz = blfsz; mpfcb->mpfsz = mpfsz; mpfcb->unused = mpfcb->mempool = mempool; mpfcb->freelist = NULL; #if USE_OBJECT_NAME if ( (pk_cmpf->mpfatr & TA_DSNAME) != 0 ) { strncpy((char*)mpfcb->name, (char*)pk_cmpf->dsname, OBJECT_NAME_LENGTH); } #endif mpfcb->mpfid = mpfid; /* Set ID after completion */ knl_UnlockOBJ(&mpfcb->lock); return mpfid; }
/* * Create task */ SYSCALL ID tk_cre_tsk_impl P1( T_CTSK *pk_ctsk ) { #if CHK_RSATR const ATR VALID_TSKATR = { /* Valid value of task attribute */ TA_HLNG |TA_RNG3 |TA_USERBUF |TA_GP #if USE_OBJECT_NAME |TA_DSNAME #endif }; #endif TCB *tcb; W sstksz; VP stack; ER ercd; CHECK_RSATR(pk_ctsk->tskatr, VALID_TSKATR); #if !USE_IMALLOC /* TA_USERBUF must be specified if configured in no Imalloc */ CHECK_PAR((pk_ctsk->tskatr & TA_USERBUF) != 0); #endif CHECK_PRI(pk_ctsk->itskpri); CHECK_PAR(pk_ctsk->stksz >= MIN_SYS_STACK_SIZE); /* Adjust stack size by 8 bytes */ sstksz = (pk_ctsk->stksz + 7) / 8 * 8; #if USE_IMALLOC if ( (pk_ctsk->tskatr & TA_USERBUF) != 0 ) { /* Size of User buffer must be multiples of 8 */ if ( sstksz != pk_ctsk->stksz ) { return E_PAR; } /* Use user buffer */ stack = pk_ctsk->bufptr; } else { /* Allocate system stack area */ stack = knl_Imalloc((UW)sstksz); if ( stack == NULL ) { return E_NOMEM; } } #else /* Size of User buffer must be multiples of 8 */ if ( sstksz != pk_ctsk->stksz ) { return E_PAR; } /* Use user buffer */ stack = pk_ctsk->bufptr; #endif BEGIN_CRITICAL_SECTION; /* Get control block from FreeQue */ tcb = (TCB*)QueRemoveNext(&knl_free_tcb); if ( tcb == NULL ) { ercd = E_LIMIT; goto error_exit; } /* Initialize control block */ tcb->exinf = pk_ctsk->exinf; tcb->tskatr = pk_ctsk->tskatr & ~TA_RNG3; /* handling as TA_RNG0 */ tcb->task = pk_ctsk->task; tcb->ipriority = (UB)int_priority(pk_ctsk->itskpri); tcb->sstksz = sstksz; #if USE_OBJECT_NAME if ( (pk_ctsk->tskatr & TA_DSNAME) != 0 ) { strncpy((char*)tcb->name, (char*)pk_ctsk->dsname, OBJECT_NAME_LENGTH); } #endif #if TA_GP /* Set global pointer */ if ( (pk_ctsk->tskatr & TA_GP) != 0 ) { gp = pk_ctsk->gp; } tcb->gp = gp; #endif /* Set stack pointer */ tcb->isstack = (VB*)stack + sstksz; /* Set initial value of task operation mode */ tcb->isysmode = 1; tcb->sysmode = 1; /* make it to DORMANT state */ knl_make_dormant(tcb); ercd = tcb->tskid; error_exit: END_CRITICAL_SECTION; #if USE_IMALLOC if ( (ercd < E_OK) && ((pk_ctsk->tskatr & TA_USERBUF) == 0) ) { knl_Ifree(stack); } #endif return ercd; }