c
/**
* 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 ;
}
c
#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
简单略有内涵。