BOOL memPartBlockIsValid ( PART_ID partId, FAST BLOCK_HDR *pHdr, BOOL isFree /* expected status */ ) { BOOL valid; TASK_LOCK (); /* LOCK PREEMPTION */ semGive (&partId->sem); /* release mutex */ valid = MEM_ALIGNED (pHdr) /* aligned */ && MEM_ALIGNED (2 * pHdr->nWords) /* size is round */ && (pHdr->nWords <= partId->totalWords) /* size <= total */ && (pHdr->free == isFree) /* right alloc-ness */ #if (CPU_FAMILY == SH) && MEM_ALIGNED(NEXT_HDR (pHdr)) /* aligned(08aug95,sa)*/ && MEM_ALIGNED(PREV_HDR (pHdr)) /* aligned(08aug95,sa)*/ #endif && (pHdr == PREV_HDR (NEXT_HDR (pHdr))) /* matches next block */ && (pHdr == NEXT_HDR (PREV_HDR (pHdr))); /* matches prev block */ semTake (&partId->sem, WAIT_FOREVER); /* reacquire mutex */ TASK_UNLOCK (); /* UNLOCK PREEMPTION */ return (valid); }
static BOOL memPartBlockIsValid(PART_ID partId, FAST BLOCK_HDR* pHdr, BOOL isFree) { BOOL valid; /* TODO lock task hear */ /* Give sem ? */ valid = MEM_ALIGNED(pHdr) && MEM_ALIGNED(pHdr->nWords*2) && (pHdr->nWords < partId->totalWords) && (pHdr->free == isFree) && (pHdr == PREV_HDR(NEXT_HDR(pHdr))) && (pHdr == NEXT_HDR(PREV_HDR(pHdr))); /* Take sem ? */ /* TODO unlock task hear */ return valid; }
int mem_pool_create (const char *name, size_t size, int n_blks, int flags) { unsigned int bytes = size * n_blks; struct mem_info *mcb = NULL; int align = MEM_ALIGNED (bytes); int memid = -1; if (align) { /*Requested memory is not aligned ,so aligned it as per machine aligenment*/ align += ((MACHINE_ALIGNEMENT - align)); bytes += align; // warn ("Memory is not aligned"); } mcb = get_next_free_mcb (&memid); /*XXX:Dynamic or Static - What to do*/ if (!mcb) { debug_mem_pool ("-ERR- : No Free Memory Blks\n"); return -1; } mcb->size = size; mcb->fblks = n_blks; mcb->useblks = 0; mcb->nblks = n_blks; mcb->memid = memid; INIT_LIST_HEAD (&mcb->n); if (!(mcb->saddr = alloc_mem (bytes))) { debug_mem_pool ("-ERR- : Insufficent Memory\n"); return -1; } /*Compute the end */ mcb->eaddr = mcb->saddr + bytes; /*build the free list as a dll to access the mem blk O(1)*/ build_free_mem_blk_list (mcb); /*Add to main control block*/ add_to_mcb (mcb); /*Return non-neg mem pool id*/ return mcb->memid; }