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.分配和释放添加锁