plugin: Added plugin_thread_create().
authorSebastian Harl <sh@tokkee.org>
Fri, 3 Feb 2012 13:57:05 +0000 (14:57 +0100)
committerSebastian Harl <sh@tokkee.org>
Fri, 3 Feb 2012 14:04:30 +0000 (15:04 +0100)
This function is a wrapper around pthread_create() which copies the plugin
context to the new thread. Else, that information would be lost.

src/plugin.c
src/plugin.h

index 7d66bd8..5387f9c 100644 (file)
@@ -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 : */
index a2f7f09..5036a63 100644 (file)
@@ -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 */