summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: b088698)
raw | patch | inline | side by side (parent: b088698)
author | Sebastian Harl <sh@tokkee.org> | |
Wed, 18 Sep 2013 08:40:36 +0000 (10:40 +0200) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Wed, 18 Sep 2013 08:40:36 +0000 (10:40 +0200) |
A custom type is used for that. The previous context type is used as a public
member of the new internal type. Thus, the external interface does not change.
member of the new internal type. Thus, the external interface does not change.
src/core/plugin.c | patch | blob | history |
diff --git a/src/core/plugin.c b/src/core/plugin.c
index 26677979b26257e4a9ef89aeed363e9d032e3418..fa00c0510b944dea05af3752c01769828b11cf28 100644 (file)
--- a/src/core/plugin.c
+++ b/src/core/plugin.c
#define SDB_PLUGIN_CB(obj) ((sdb_plugin_cb_t *)(obj))
#define SDB_PLUGIN_CCB(obj) ((sdb_plugin_collector_cb_t *)(obj))
+typedef struct {
+ sdb_object_t super;
+ sdb_plugin_ctx_t public;
+} ctx_t;
+#define CTX_INIT { SDB_OBJECT_INIT, \
+ SDB_PLUGIN_CTX_INIT }
+
+#define CTX(obj) ((ctx_t *)(obj))
+
/*
* private variables
*/
static sdb_plugin_ctx_t plugin_default_ctx = SDB_PLUGIN_CTX_INIT;
-static pthread_key_t plugin_ctx_key;
-static _Bool plugin_ctx_key_initialized = 0;
+static pthread_key_t plugin_ctx_key;
+static _Bool plugin_ctx_key_initialized = 0;
static sdb_llist_t *config_list = NULL;
static sdb_llist_t *init_list = NULL;
} /* sdb_plugin_info_clear */
static void
-sdb_plugin_ctx_destructor(void *ctx)
+ctx_destructor(void *c)
{
- if (! ctx)
- return;
- free(ctx);
-} /* sdb_plugin_ctx_destructor */
+ sdb_object_deref(SDB_OBJ(c));
+} /* ctx_destructor */
static void
-sdb_plugin_ctx_init(void)
+ctx_key_init(void)
{
if (plugin_ctx_key_initialized)
return;
- pthread_key_create(&plugin_ctx_key, sdb_plugin_ctx_destructor);
+ pthread_key_create(&plugin_ctx_key, ctx_destructor);
plugin_ctx_key_initialized = 1;
-} /* sdb_plugin_ctx_init */
-
-static sdb_plugin_ctx_t *
-sdb_plugin_ctx_create(void)
-{
- sdb_plugin_ctx_t *ctx;
-
- ctx = malloc(sizeof(*ctx));
- if (! ctx)
- return NULL;
-
- *ctx = plugin_default_ctx;
-
- if (! plugin_ctx_key_initialized)
- sdb_plugin_ctx_init();
- pthread_setspecific(plugin_ctx_key, ctx);
- return ctx;
-} /* sdb_plugin_ctx_create */
+} /* ctx_key_init */
static int
sdb_plugin_cmp_next_update(const sdb_object_t *a, const sdb_object_t *b)
* private types
*/
+static int
+ctx_init(sdb_object_t *obj, va_list __attribute__((unused)) ap)
+{
+ ctx_t *ctx = CTX(obj);
+
+ assert(ctx);
+
+ ctx->public = plugin_default_ctx;
+ return 0;
+} /* ctx_init */
+
+static sdb_type_t ctx_type = {
+ sizeof(ctx_t),
+
+ ctx_init,
+ NULL
+};
+
+static ctx_t *
+ctx_create(void)
+{
+ ctx_t *ctx;
+
+ ctx = CTX(sdb_object_create("plugin-context", ctx_type));
+ if (! ctx)
+ return NULL;
+
+ if (! plugin_ctx_key_initialized)
+ ctx_key_init();
+ pthread_setspecific(plugin_ctx_key, ctx);
+ return ctx;
+} /* ctx_create */
+
static int
sdb_plugin_cb_init(sdb_object_t *obj, va_list ap)
{
@@ -516,36 +539,36 @@ sdb_plugin_register_collector(const char *name, sdb_plugin_collector_cb callback
sdb_plugin_ctx_t
sdb_plugin_get_ctx(void)
{
- sdb_plugin_ctx_t *ctx;
+ ctx_t *ctx;
if (! plugin_ctx_key_initialized)
- sdb_plugin_ctx_init();
+ ctx_key_init();
ctx = pthread_getspecific(plugin_ctx_key);
if (! ctx)
- ctx = sdb_plugin_ctx_create();
+ ctx = ctx_create();
if (! ctx)
return plugin_default_ctx;
- return *ctx;
+ return ctx->public;
} /* sdb_plugin_get_ctx */
sdb_plugin_ctx_t
sdb_plugin_set_ctx(sdb_plugin_ctx_t ctx)
{
- sdb_plugin_ctx_t *tmp;
+ ctx_t *tmp;
sdb_plugin_ctx_t old;
if (! plugin_ctx_key_initialized)
- sdb_plugin_ctx_init();
+ ctx_key_init();
tmp = pthread_getspecific(plugin_ctx_key);
if (! tmp)
- tmp = sdb_plugin_ctx_create();
+ tmp = ctx_create();
if (! tmp)
return plugin_default_ctx;
- old = *tmp;
- *tmp = ctx;
+ old = tmp->public;
+ tmp->public = ctx;
return old;
} /* sdb_plugin_set_ctx */