gSoap源码中Alist的使用


gSoap源码中Alist的使用

typedef struct ALIST_S{
    void *memlist;
    pthread_mutex_t mutex;
}ALIST_T;

#define SOAP_MAXALLOCSIZE (0)   // 无限制
#define SOAP_CANARY  (0xC0DE)

int alist_init(ALIST_T *list);
void *soap_malloc(ALIST_T *list, size_t n);
void *alist_calloc(ALIST_T *list, size_t n);
char *alist_strdup(ALIST_T *list, const char *s);
void alist_dealloc(ALIST_T *list, void *p);
void alist_uninit(ALIST_T *list);
void echo_alist(ALIST_T *list);

源码
int alist_init(ALIST_T *list)
{
    int iRet = 0;

    if (list)
    {
        list->memlist = NULL;
        pthread_mutex_init(&list->mutex, NULL);
    }
    else
    {
        iRet = -1;
    }

    return iRet;
}

void* alist_calloc(ALIST_T *list, size_t n)
{ 
    char *p;

    if (SOAP_MAXALLOCSIZE > 0 && n > SOAP_MAXALLOCSIZE)
        return NULL;
    if (n + sizeof(short) < n)
        return NULL;
    n += sizeof(short);
    if (n + ((-(long)n) & (sizeof(void*)-1)) + sizeof(void*) + sizeof(size_t) < n)
        return NULL;
    n += (-(long)n) & (sizeof(void*)-1); /* align at 4-, 8- or 16-byte boundary by rounding up */   
    p = (char*)SOAP_CALLOC(n + sizeof(void*) + sizeof(size_t));
    if (!p)
    { 
        return NULL;
    }
    /* set a canary word to detect memory overruns and data corruption */
    *(unsigned short*)(p + n - sizeof(unsigned short)) = (unsigned short)SOAP_CANARY;
    /* keep chain of alloced cells for destruction */
    pthread_mutex_lock(&list->mutex);
    *(void**)(p + n) = list->memlist;
    *(size_t*)(p + n + sizeof(void*)) = n;
    list->memlist = p + n;
    PRINT_Y("[%d]List:%x", n, *list);
    pthread_mutex_unlock(&list->mutex);

    return p;
}

char *alist_strdup(ALIST_T *list, const char *s)
{ 
  char *t = NULL;
  if (s)
  { 
    size_t n = strlen(s) + 1;
    if (n > 0)
    { t = (char*)alist_calloc(list, n);
      if (t)
      { memcpy((void*)t, (const void*)s, n);
        t[n - 1] = '\0';
      }
    }
  }
  return t;
}

void alist_dealloc(ALIST_T *list, void *p)
{
  if (list)
  {
    pthread_mutex_lock(&list->mutex);
    if (p)
    {
        char **q;
        for (q = (char **)(void *)&list->memlist; *q; q = *(char***)q)
        {
            if (*(unsigned short*)(char*)(*q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY)
            {
            pthread_mutex_unlock(&list->mutex);
                return;
            }
            if (p == (void*)(*q - *(size_t*)(*q + sizeof(void*))))
            {
                *q = **(char***)q;
                SOAP_FREE(p);
                pthread_mutex_unlock(&list->mutex);
                return;
            }
        }
    }
    else
    {
        char *q;
        while (list->memlist)
        {
            q = (char*)list->memlist;
            if (*(unsigned short*)(char*)(q - sizeof(unsigned short)) != (unsigned short)SOAP_CANARY)
            {
            pthread_mutex_unlock(&list->mutex);
                return;
            }
            *list = *(void**)q;
            q -= *(size_t*)(q + sizeof(void*));
            SOAP_FREE(p);
        }
    }
    pthread_mutex_unlock(&list->mutex);
  }
    return;
}

void alist_uninit(ALIST_T *list)
{
    if (list)
    {
        alist_dealloc(list, NULL);
        pthread_mutex_destroy(&list->mutex);
    }

    return ;
}

void alist_echo(ALIST_T *list)
{
    char *q;
    char *tmp;
    int index = 0;

    if (list)
    {
    pthread_mutex_lock(&list->mutex);
    tmp = list->memlist;
    while(tmp)
    {
        q = (char*)tmp;
        if (*(unsigned short*)(char*)(q-sizeof(unsigned short)) != (unsigned short)SOAP_CANARY)
        {
        pthread_mutex_unlock(&list->mutex);
        return;
        }
        tmp = *(void**)q;
        q -= *(size_t*)(q + sizeof(void*));
        index ++;
    }
    pthread_mutex_unlock(&list->mutex);
    }

    return ;
}

特点

1.代码结构简洁
2.可以对多指针的结构体进行统一分配和释放
3.分配和释放添加锁

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值