diff --git a/daemon/bencode.c b/daemon/bencode.c index a3e648832..a873a83e6 100644 --- a/daemon/bencode.c +++ b/daemon/bencode.c @@ -20,6 +20,7 @@ struct __bencode_buffer_piece { }; struct __bencode_free_list { void *ptr; + free_func_t func; struct __bencode_free_list *next; }; struct __bencode_hash { @@ -129,7 +130,7 @@ void bencode_buffer_free(bencode_buffer_t *buf) { struct __bencode_buffer_piece *piece, *next; for (fl = buf->free_list; fl; fl = fl->next) - BENCODE_FREE(fl->ptr); + fl->func(fl->ptr); for (piece = buf->pieces; piece; piece = next) { next = piece->next; @@ -664,7 +665,7 @@ bencode_item_t *bencode_dictionary_get_len(bencode_item_t *dict, const char *key return NULL; } -void bencode_buffer_freelist_add(bencode_buffer_t *buf, void *p) { +void bencode_buffer_destroy_add(bencode_buffer_t *buf, free_func_t func, void *p) { struct __bencode_free_list *li; if (!p) @@ -673,6 +674,7 @@ void bencode_buffer_freelist_add(bencode_buffer_t *buf, void *p) { if (!li) return; li->ptr = p; + li->func = func; li->next = buf->free_list; buf->free_list = li; } diff --git a/daemon/bencode.h b/daemon/bencode.h index 61ff6bd50..342a61d9d 100644 --- a/daemon/bencode.h +++ b/daemon/bencode.h @@ -30,6 +30,7 @@ struct __bencode_free_list; typedef enum bencode_type bencode_type_t; typedef struct bencode_buffer bencode_buffer_t; typedef struct bencode_item bencode_item_t; +typedef void (*free_func_t)(void *); enum bencode_type { BENCODE_INVALID = 0, @@ -84,7 +85,11 @@ bencode_item_t *bencode_list(bencode_buffer_t *buf); /* Adds a pointer to the bencode_buffer_t object's internal free list. When the bencode_buffer_t * object is destroyed, BENCODE_FREE will be called on this pointer. */ -void bencode_buffer_freelist_add(bencode_buffer_t *buf, void *); +static inline void bencode_buffer_freelist_add(bencode_buffer_t *buf, void *); + +/* Similar to bencode_buffer_freelist_add(), but instead of freeing/destroying the object at the + * given pointer with BENCODE_FREE, the specified destroy function is called. */ +void bencode_buffer_destroy_add(bencode_buffer_t *buf, free_func_t, void *); @@ -460,4 +465,8 @@ static inline str *bencode_get_str(bencode_item_t *in, str *out) { return out; } +static inline void bencode_buffer_freelist_add(bencode_buffer_t *buf, void *p) { + bencode_buffer_destroy_add(buf, BENCODE_FREE, p); +} + #endif