ER rel_mpf(ID mpfid, void *blk) { MPFCB *p_mpfcb; size_t blkoffset; uint_t blkidx; TCB *p_tcb; ER ercd; LOG_REL_MPF_ENTER(mpfid, blk); CHECK_TSKCTX_UNL(); CHECK_ID(VALID_MPFID(mpfid)); p_mpfcb = get_mpfcb(mpfid); lock_cpu(); if (p_mpfcb->p_mpfinib->mpfatr == TA_NOEXS) { ercd = E_NOEXS; } else { blkoffset = ((char *) blk) - (char *)(p_mpfcb->p_mpfinib->mpf); blkidx = (uint_t)(blkoffset / p_mpfcb->p_mpfinib->blksz); if (!(p_mpfcb->p_mpfinib->mpf <= blk) || !(blkoffset % p_mpfcb->p_mpfinib->blksz == 0U) || !(blkoffset / p_mpfcb->p_mpfinib->blksz < p_mpfcb->unused) || !((p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next == INDEX_ALLOC)) { ercd = E_PAR; } else if (!queue_empty(&(p_mpfcb->wait_queue))) { p_tcb = (TCB *) queue_delete_next(&(p_mpfcb->wait_queue)); ((WINFO_MPF *)(p_tcb->p_winfo))->blk = blk; wait_complete(p_tcb); if (p_runtsk != p_schedtsk) { dispatch(); } ercd = E_OK; } else { p_mpfcb->fblkcnt++; (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = p_mpfcb->freelist; p_mpfcb->freelist = blkidx; ercd = E_OK; } } unlock_cpu(); error_exit: LOG_REL_MPF_LEAVE(ercd); return(ercd); }
ER rel_mpf(ID mpfid, void *blk) { MPFCB *p_mpfcb; SIZE blkoffset; uint_t blkidx; TCB *p_tcb; ER ercd; LOG_REL_MPF_ENTER(mpfid, blk); CHECK_TSKCTX_UNL(); CHECK_MPFID(mpfid); p_mpfcb = get_mpfcb(mpfid); CHECK_PAR(p_mpfcb->p_mpfinib->mpf <= blk); blkoffset = ((char *) blk) - (char *)(p_mpfcb->p_mpfinib->mpf); CHECK_PAR(blkoffset % p_mpfcb->p_mpfinib->blksz == 0U); CHECK_PAR(blkoffset / p_mpfcb->p_mpfinib->blksz < p_mpfcb->unused); blkidx = (uint_t)(blkoffset / p_mpfcb->p_mpfinib->blksz); CHECK_PAR((p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next == INDEX_ALLOC); t_lock_cpu(); if (!queue_empty(&(p_mpfcb->wait_queue))) { p_tcb = (TCB *) queue_delete_next(&(p_mpfcb->wait_queue)); ((WINFO_MPF *)(p_tcb->p_winfo))->blk = blk; if (wait_complete(p_tcb)) { dispatch(); } ercd = E_OK; } else { p_mpfcb->fblkcnt++; (p_mpfcb->p_mpfinib->p_mpfmb + blkidx)->next = p_mpfcb->freelist; p_mpfcb->freelist = blkidx; ercd = E_OK; } t_unlock_cpu(); error_exit: LOG_REL_MPF_LEAVE(ercd); return(ercd); }