示例#1
0
static cdx_err __CdxQueuePush(CdxQueueT *queue, CdxQueueDataT data)
{
    struct CdxQueueImplS *impl;
    struct CdxQueueNodeEntityS *entity, *tmpEntity;
    cdx_bool ret;
    
    CDX_ASSERT(queue);
    impl = CdxContainerOf(queue, struct CdxQueueImplS, base);
    
    if (!impl->enablePush)
    {
        return -1;
    }
    entity = Palloc(impl->pool, sizeof(*entity));
    CDX_ASSERT(entity);
    CDX_ASSERT(data);/*不希望有为0的data*/
    entity->data = data;
    entity->next = NULL;
    CdxAtomicSet(&entity->ref, 1);

    do
    {
        tmpEntity = impl->rear;
    }
    while (!CdxAtomicBoolCAS(&tmpEntity->next, NULL, entity));

    ret = CdxAtomicBoolCAS(&impl->rear, tmpEntity, entity);
    CDX_ASSERT(CDX_TRUE == ret);

    return CDX_SUCCESS;
}
示例#2
0
void * Palloc0(int size,void * base)
{
	void * mem=Palloc(size,base);
	if(mem!=NULL)
		Memset(mem,0,size);
	return mem;
}
示例#3
0
CdxQueueT *CdxQueueCreate(AwPoolT *pool)
{
    struct CdxQueueImplS *impl;
    struct CdxQueueNodeEntityS *dummy;
    impl = Palloc(pool, sizeof(struct CdxQueueImplS));
    CDX_ASSERT(impl);
    memset(impl, 0x00, sizeof(struct CdxQueueImplS));

    impl->pool = pool;
    dummy = Palloc(impl->pool, sizeof(struct CdxQueueNodeEntityS));
    CDX_ASSERT(dummy);
    dummy->next = NULL;
    dummy->data = NULL;

    impl->front = dummy;
    impl->rear = dummy;
    impl->base.ops = &gQueueOps;
    impl->enablePop = CDX_TRUE;
    impl->enablePush = CDX_TRUE;
    return &impl->base;
}