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; }
void * Palloc0(int size,void * base) { void * mem=Palloc(size,base); if(mem!=NULL) Memset(mem,0,size); return mem; }
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; }