summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: c6da31f)
raw | patch | inline | side by side (parent: c6da31f)
author | Pavel Rochnyack <pavel2000@ngs.ru> | |
Fri, 13 May 2016 08:50:31 +0000 (14:50 +0600) | ||
committer | Sebastian Harl <sh@tokkee.org> | |
Mon, 30 May 2016 19:51:36 +0000 (21:51 +0200) |
Avoid race conditions with c_ithread_create() called from threads of already-initialized plugins.
Fix for https://github.com/collectd/collectd/issues/1706.
Fix for https://github.com/collectd/collectd/issues/1706.
src/perl.c | patch | blob | history |
diff --git a/src/perl.c b/src/perl.c
index 41e763dc098d303f9cc67fc7028b780707d528dd..4daa7621e4bec0d0c89103aa6f94eb452a9d9e76 100644 (file)
--- a/src/perl.c
+++ b/src/perl.c
-/**
+/*
* collectd - src/perl.c
* Copyright (C) 2007-2009 Sebastian Harl
*
static int perl_init (void)
{
+ int status;
dTHX;
if (NULL == perl_threads)
log_debug ("perl_init: c_ithread: interp = %p (active threads: %i)",
aTHX, perl_threads->number_of_threads);
- return pplugin_call_all (aTHX_ PLUGIN_INIT);
+
+ /* Lock the base thread to avoid race conditions with c_ithread_create().
+ * See https://github.com/collectd/collectd/issues/9 and
+ * https://github.com/collectd/collectd/issues/1706 for details. */
+
+ assert (aTHX == perl_threads->head->interp);
+ pthread_mutex_lock (&perl_threads->mutex);
+
+ status = pplugin_call_all (aTHX_ PLUGIN_INIT);
+
+ pthread_mutex_unlock (&perl_threads->mutex);
+
+ return status;
} /* static int perl_init (void) */
static int perl_read (void)