Browse Source

add custom destroy function for free list

git.mgm/mediaproxy-ng/2.2
Richard Fuchs 13 years ago
parent
commit
2e0a8c42d5
2 changed files with 14 additions and 3 deletions
  1. +4
    -2
      daemon/bencode.c
  2. +10
    -1
      daemon/bencode.h

+ 4
- 2
daemon/bencode.c View File

@ -20,6 +20,7 @@ struct __bencode_buffer_piece {
}; };
struct __bencode_free_list { struct __bencode_free_list {
void *ptr; void *ptr;
free_func_t func;
struct __bencode_free_list *next; struct __bencode_free_list *next;
}; };
struct __bencode_hash { struct __bencode_hash {
@ -129,7 +130,7 @@ void bencode_buffer_free(bencode_buffer_t *buf) {
struct __bencode_buffer_piece *piece, *next; struct __bencode_buffer_piece *piece, *next;
for (fl = buf->free_list; fl; fl = fl->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) { for (piece = buf->pieces; piece; piece = next) {
next = 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; 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; struct __bencode_free_list *li;
if (!p) if (!p)
@ -673,6 +674,7 @@ void bencode_buffer_freelist_add(bencode_buffer_t *buf, void *p) {
if (!li) if (!li)
return; return;
li->ptr = p; li->ptr = p;
li->func = func;
li->next = buf->free_list; li->next = buf->free_list;
buf->free_list = li; buf->free_list = li;
} }

+ 10
- 1
daemon/bencode.h View File

@ -30,6 +30,7 @@ struct __bencode_free_list;
typedef enum bencode_type bencode_type_t; typedef enum bencode_type bencode_type_t;
typedef struct bencode_buffer bencode_buffer_t; typedef struct bencode_buffer bencode_buffer_t;
typedef struct bencode_item bencode_item_t; typedef struct bencode_item bencode_item_t;
typedef void (*free_func_t)(void *);
enum bencode_type { enum bencode_type {
BENCODE_INVALID = 0, 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 /* 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. */ * 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; return out;
} }
static inline void bencode_buffer_freelist_add(bencode_buffer_t *buf, void *p) {
bencode_buffer_destroy_add(buf, BENCODE_FREE, p);
}
#endif #endif

Loading…
Cancel
Save