示例#1
0
bool
PoolCreate(TPool *  const poolP,
           uint32_t const zonesize) {

    bool success;
    bool mutexCreated;

    poolP->zonesize = zonesize;

    mutexCreated = MutexCreate(&poolP->mutexP);
    if (mutexCreated) {
        TPoolZone * const firstZoneP = PoolZoneAlloc(zonesize);

        if (firstZoneP != NULL) {
            poolP->firstzone   = firstZoneP;
            poolP->currentzone = firstZoneP;
            success = TRUE;
        } else
            success = FALSE;
        if (!success)
            MutexDestroy(poolP->mutexP);
    } else
        success = FALSE;

    return success;
}
示例#2
0
文件: data.c 项目: cmjonze/anacapa
int PoolCreate(TPool *p,uint32 zonesize)
{
	/* sanity */
	if (!p) {
		return FALSE;
	}

	p->zonesize=zonesize;
	if (MutexCreate(&p->mutex))
		if (!(p->firstzone=p->currentzone=PoolZoneAlloc(zonesize)))
		{
			MutexFree(&p->mutex);
			return FALSE;
		};
	
	return TRUE;
}
示例#3
0
文件: data.c 项目: cmjonze/anacapa
void *PoolAlloc(TPool *p,uint32 size)
{
	TPoolZone *pz = 0;
	TPoolZone *npz = 0;
	void *x = 0;
	uint32 zonesize = 0;

	/* sanity */
	if (!p || !size) {
		return NULL;
	}

	if (!MutexLock(&p->mutex))
		return NULL;

	pz=p->currentzone;

	if (pz->pos+size<pz->maxpos)
	{
		x=pz->pos;
		pz->pos+=size;
		MutexUnlock(&p->mutex);
		return x;
	};

	if (size>p->zonesize)
		zonesize=size;
	else
		zonesize=p->zonesize;

	if( (npz = PoolZoneAlloc(zonesize)) )
	{
		npz->prev=pz;
		npz->next=pz->next;
		pz->next=npz;
		p->currentzone=npz; 
		x=(void *)(npz+1);
		npz->pos=((char *)(npz+1))+size;
	}
	else
		x=NULL;

	MutexUnlock(&p->mutex);
	return x;
}
示例#4
0
void *
PoolAlloc(TPool *  const poolP,
          uint32_t const size) {
/*----------------------------------------------------------------------------
   Allocate a block of size 'size' from pool 'poolP'.
-----------------------------------------------------------------------------*/
    void * retval;

    if (size == 0)
        retval = NULL;
    else {
        bool gotMutexLock;

        gotMutexLock = MutexLock(poolP->mutexP);
        if (!gotMutexLock)
            retval = NULL;
        else {
            TPoolZone * const curPoolZoneP = poolP->currentzone;

            if (curPoolZoneP->pos + size < curPoolZoneP->maxpos) {
                retval = curPoolZoneP->pos;
                curPoolZoneP->pos += size;
            } else {
                uint32_t const zonesize = MAX(size, poolP->zonesize);

                TPoolZone * const newPoolZoneP = PoolZoneAlloc(zonesize);
                if (newPoolZoneP) {
                    newPoolZoneP->prev = curPoolZoneP;
                    newPoolZoneP->next = curPoolZoneP->next;
                    curPoolZoneP->next = newPoolZoneP;
                    poolP->currentzone = newPoolZoneP;
                    retval= newPoolZoneP->data;
                    newPoolZoneP->pos = newPoolZoneP->data + size;
                } else
                    retval = NULL;
            }
            MutexUnlock(poolP->mutexP);
        }
    }
    return retval;
}