From: Sebastian Harl Date: Fri, 3 Feb 2012 13:57:05 +0000 (+0100) Subject: plugin: Added plugin_thread_create(). X-Git-Tag: collectd-5.2.0~20^2~18 X-Git-Url: https://git.tokkee.org/?a=commitdiff_plain;h=81346b256c86c3c16b1cfa8a8aac895c5c5e17cd;p=collectd.git plugin: Added plugin_thread_create(). This function is a wrapper around pthread_create() which copies the plugin context to the new thread. Else, that information would be lost. --- diff --git a/src/plugin.c b/src/plugin.c index 7d66bd87..5387f9c4 100644 --- a/src/plugin.c +++ b/src/plugin.c @@ -2045,4 +2045,41 @@ plugin_ctx_t plugin_set_ctx (plugin_ctx_t ctx) return (old); } /* void plugin_set_ctx */ +typedef struct { + plugin_ctx_t ctx; + void *(*start_routine) (void *); + void *arg; +} plugin_thread_t; + +static void *plugin_thread_start (void *arg) +{ + plugin_thread_t *plugin_thread = arg; + + void *(*start_routine) (void *) = plugin_thread->start_routine; + void *plugin_arg = plugin_thread->arg; + + plugin_set_ctx (plugin_thread->ctx); + + free (plugin_thread); + + return start_routine (plugin_arg); +} /* void *plugin_thread_start */ + +int plugin_thread_create (pthread_t *thread, const pthread_attr_t *attr, + void *(*start_routine) (void *), void *arg) +{ + plugin_thread_t *plugin_thread; + + plugin_thread = malloc (sizeof (*plugin_thread)); + if (plugin_thread == NULL) + return -1; + + plugin_thread->ctx = plugin_get_ctx (); + plugin_thread->start_routine = start_routine; + plugin_thread->arg = arg; + + return pthread_create (thread, attr, + plugin_thread_start, plugin_thread); +} /* int plugin_thread_create */ + /* vim: set sw=8 ts=8 noet fdm=marker : */ diff --git a/src/plugin.h b/src/plugin.h index a2f7f098..5036a63b 100644 --- a/src/plugin.h +++ b/src/plugin.h @@ -378,4 +378,11 @@ void plugin_init_ctx (void); plugin_ctx_t plugin_get_ctx (void); plugin_ctx_t plugin_set_ctx (plugin_ctx_t ctx); +/* + * Context-aware thread management. + */ + +int plugin_thread_create (pthread_t *thread, const pthread_attr_t *attr, + void *(*start_routine) (void *), void *arg); + #endif /* PLUGIN_H */