/*** memca.c* 应用程序内存缓存简易实现* * 用于尝试解决在内存分配偶现耗时问题* * memca 不要求额外内存用于此处管理* 正因为如此,所缓存内存单元最小为* 指针大小(sizeof(void *))*/
#include "memca.h"
#include <stdlib.h>#define MEMCA_MAX(a, b) ((a) > (b) ? (a) : (b))
#define MEMCA_MUTEX(m) ({\(m) = (pthread_mutex_t) PTHREAD_MUTEX_INITIALIZER;\
})void memca_init (struct memca_s *ma)
{uint16_t size = MEMCA_MAX(ma->size, sizeof(void *));uint32_t max = ma->max;void *last = NULL;ma->head = ma->num = 0;MEMCA_MUTEX(ma->lock);ma->size = size;while (max--) {void *v = malloc(size);if (!v)return ;if (!last) {ma->head = last = v;} else {*(void **) last = v;last = v;}*(void **)v = NULL;ma->num += 1;}return ;
}void memca_close(struct memca_s *ma)
{void *v;while ((v=ma->head)) {ma->head = *(void **)v;ma->num -= 1;free(v);}return ;
}void * memca_alloc(struct memca_s *ma)
{void *v;pthread_mutex_lock(&ma->lock);if ((v=ma->head)) {ma->head = *(void **)v;ma->num -= 1;}pthread_mutex_unlock(&ma->lock);return v ?: malloc(ma->size);
}void memca_free(struct memca_s *ma, void *v)
{pthread_mutex_lock(&ma->lock);if (ma->num < ma->max) {*(void **)v = ma->head;ma->head = v;ma->num += 1;v = NULL;}pthread_mutex_unlock(&ma->lock);free(v);return ;
}
#ifndef MEMCA_H
#define MEMCA_H#include <inttypes.h>
#include <pthread.h>struct memca_s {const char *name;uint16_t size;pthread_mutex_t lock;uint32_t max;uint32_t num;void *head;
};void memca_init (struct memca_s *ma);
void memca_close(struct memca_s *ma);void * memca_alloc(struct memca_s *ma);
void memca_free (struct memca_s *ma, void *v);
#endif
简单略有内涵。