#include <string.h>
#include "shl_dlist.h"
+typedef void (*shl_register_destroy_cb) (void *data);
+
struct shl_register_record {
struct shl_dlist list;
unsigned long ref;
char *name;
void *data;
+ shl_register_destroy_cb destroy;
};
struct shl_register {
if (ref)
return;
+ if (record->destroy)
+ record->destroy(record->data);
pthread_mutex_destroy(&record->mutex);
free(record->name);
free(record);
free(reg);
}
-static inline int shl_register_add(struct shl_register *reg, const char *name,
- void *data)
+static inline int shl_register_add_cb(struct shl_register *reg,
+ const char *name, void *data,
+ shl_register_destroy_cb destroy)
{
struct shl_dlist *iter;
struct shl_register_record *record;
memset(record, 0, sizeof(*record));
record->ref = 1;
record->data = data;
+ record->destroy = destroy;
ret = pthread_mutex_init(&record->mutex, NULL);
if (ret) {
return ret;
}
+static inline int shl_register_add(struct shl_register *reg, const char *name,
+ void *data)
+{
+ return shl_register_add_cb(reg, name, data, NULL);
+}
+
static inline void shl_register_remove(struct shl_register *reg,
const char *name)
{