Esempio n. 1
0
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);
    }
Esempio n. 2
0
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;
}
Esempio n. 3
0
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;
}