diff --git a/extend.c b/extend.c index e255d6f..8144213 100644 --- a/extend.c +++ b/extend.c @@ -77,7 +77,7 @@ static int cache_get(const struct sockaddr_ina *dst) uint8_t key[KEY_SIZE] = { 0 }; int len = serialize_addr(dst, key, sizeof(key)); - struct elem *val = mem_get(params.mempool, (char *)key, len); + struct elem_i *val = (struct elem_i *)mem_get(params.mempool, (char *)key, len); if (!val) { return -1; } @@ -106,7 +106,7 @@ static int cache_add(const struct sockaddr_ina *dst, int m) LOG(LOG_S, "save ip: %s, m=%d\n", ADDR_STR, m); time_t t = time(0); - struct elem *val = mem_add(params.mempool, (char *)key, len); + struct elem_i *val = (struct elem_i *)mem_add(params.mempool, (char *)key, len, sizeof(struct elem_i)); if (!val) { uniperror("mem_add"); return -1; diff --git a/main.c b/main.c index b539132..8ce122b 100644 --- a/main.c +++ b/main.c @@ -306,7 +306,7 @@ struct mphdr *parse_hosts(char *buffer, size_t size) s++; continue; } - if (mem_add(hdr, s, e - s) == 0) { + if (mem_add(hdr, s, e - s, sizeof(struct elem)) == 0) { free(hdr); return 0; } diff --git a/mpool.c b/mpool.c index 50fe43e..8ac1fb2 100644 --- a/mpool.c +++ b/mpool.c @@ -15,68 +15,70 @@ static inline int scmp(const struct elem *p, const struct elem *q) KAVL_INIT(my, struct elem, head, scmp) -struct mphdr *mem_pool(bool cst) +struct mphdr *mem_pool(bool is_static) { struct mphdr *hdr = calloc(sizeof(struct mphdr), 1); if (hdr) { - hdr->stat = cst; + hdr->static_data = is_static; } return hdr; } -struct elem *mem_get(struct mphdr *hdr, char *str, int len) +struct elem *mem_get(const struct mphdr *hdr, const char *str, int len) { struct { int len; - char *data; + const char *data; } temp = { .len = len, .data = str }; return kavl_find(my, hdr->root, (struct elem *)&temp, 0); } -struct elem *mem_add(struct mphdr *hdr, char *str, int len) +struct elem *mem_add(struct mphdr *hdr, char *str, int len, size_t struct_size) { - struct elem *v, *e = calloc(sizeof(struct elem), 1); + struct elem *v, *e = calloc(struct_size, 1); if (!e) { return 0; } e->len = len; - if (!hdr->stat) { - e->data = malloc(len); - if (!e->data) { - free(e); - return 0; + while (1) { + if (!hdr->static_data) { + e->data = malloc(len); + if (!e->data) { + break; + } + memcpy(e->data, str, len); } - memcpy(e->data, str, len); - } - else { - e->data = str; - } - v = kavl_insert(my, &hdr->root, e, 0); - if (e != v) { - if (!hdr->stat) { - free(e->data); + else { + e->data = str; } - free(e); + v = kavl_insert(my, &hdr->root, e, 0); + if (e != v) { + if (!hdr->static_data) + free(e->data); + break; + } + return v; } - return v; + free(e); + return 0; } -void mem_delete(struct mphdr *hdr, char *str, int len) +void mem_delete(struct mphdr *hdr, const char *str, int len) { struct { int len; - char *data; + const char *data; } temp = { .len = len, .data = str }; struct elem *e = kavl_erase(my, &hdr->root, (struct elem *)&temp, 0); if (!e) { return; } - if (!hdr->stat) { + if (!hdr->static_data) { free(e->data); e->data = 0; } @@ -91,7 +93,7 @@ void mem_destroy(struct mphdr *hdr) if (!e) { break; } - if (!hdr->stat && e->data) { + if (!hdr->static_data) { free(e->data); } e->data = 0; diff --git a/mpool.h b/mpool.h index c209dc0..cf60d85 100644 --- a/mpool.h +++ b/mpool.h @@ -8,23 +8,27 @@ struct elem { int len; char *data; - int m; - time_t time; KAVL_HEAD(struct elem) head; }; +struct elem_i { + struct elem i; + int m; + time_t time; +}; + struct mphdr { - bool stat; + bool static_data; struct elem *root; }; -struct mphdr *mem_pool(bool cst); +struct mphdr *mem_pool(bool is_static); -struct elem *mem_get(struct mphdr *hdr, char *str, int len); +struct elem *mem_get(const struct mphdr *hdr, const char *str, int len); -struct elem *mem_add(struct mphdr *hdr, char *str, int len); +struct elem *mem_add(struct mphdr *hdr, char *str, int len, size_t ssize); -void mem_delete(struct mphdr *hdr, char *str, int len); +void mem_delete(struct mphdr *hdr, const char *str, int len); void mem_destroy(struct mphdr *hdr);