From 7b56fff886f05d8379bcd4c5885d85001b05a31c Mon Sep 17 00:00:00 2001 From: Pavel Rochnyack Date: Mon, 30 May 2016 11:52:21 +0600 Subject: [PATCH] perl plugin: Added call_pv_locked() wrapper to handle thread locking flags. --- src/perl.c | 52 +++++++++++++++++++++++++--------------------------- 1 file changed, 25 insertions(+), 27 deletions(-) diff --git a/src/perl.c b/src/perl.c index 682ff832..b0ab6312 100644 --- a/src/perl.c +++ b/src/perl.c @@ -1006,30 +1006,43 @@ static int pplugin_dispatch_notification (pTHX_ HV *notif) } /* static int pplugin_dispatch_notification (HV *) */ /* - * Call all working functions of the given type. + * Call perl sub with thread locking flags handled. */ -static int pplugin_call_all (pTHX_ int type, ...) +static int call_pv_locked (pTHX_ const char* sub_name) { - int retvals = 0; - _Bool old_running; - va_list ap; - int ret = 0; - - dSP; + int ret; c_ithread_t *t = (c_ithread_t *)pthread_getspecific(perl_thr_key); - if (t == NULL) /* thread destroyed ( c_ithread_destroy*() -> log_debug() ) */ + if (t == NULL) /* thread destroyed */ return 0; old_running = t->running; t->running = 1; - + if (t->shutdown) { t->running = old_running; return 0; } + ret = call_pv (sub_name, G_SCALAR); + + t->running = old_running; + return ret; +} /* static int call_pv_locked (pTHX, *sub_name) */ + +/* + * Call all working functions of the given type. + */ +static int pplugin_call_all (pTHX_ int type, ...) +{ + int retvals = 0; + + va_list ap; + int ret = 0; + + dSP; + if ((type < 0) || (type >= PLUGIN_TYPES)) return -1; @@ -1147,7 +1160,7 @@ static int pplugin_call_all (pTHX_ int type, ...) PUTBACK; - retvals = call_pv ("Collectd::plugin_call_all", G_SCALAR); + retvals = call_pv_locked (aTHX_ "Collectd::plugin_call_all"); SPAGAIN; if (0 < retvals) { @@ -1160,7 +1173,6 @@ static int pplugin_call_all (pTHX_ int type, ...) FREETMPS; LEAVE; - t->running = old_running; va_end (ap); return ret; } /* static int pplugin_call_all (int, ...) */ @@ -1286,7 +1298,6 @@ static int fc_call (pTHX_ int type, int cb_type, pfc_user_data_t *data, ...) { int retvals = 0; - _Bool old_running; va_list ap; int ret = 0; @@ -1295,18 +1306,6 @@ static int fc_call (pTHX_ int type, int cb_type, pfc_user_data_t *data, ...) dSP; - c_ithread_t *t = (c_ithread_t *)pthread_getspecific(perl_thr_key); - if (t == NULL) /* thread destroyed */ - return 0; - - old_running = t->running; - t->running = 1; - - if (t->shutdown) { - t->running = old_running; - return 0; - } - if ((type < 0) || (type >= FC_TYPES)) return -1; @@ -1405,7 +1404,7 @@ static int fc_call (pTHX_ int type, int cb_type, pfc_user_data_t *data, ...) PUTBACK; - retvals = call_pv ("Collectd::fc_call", G_SCALAR); + retvals = call_pv_locked (aTHX_ "Collectd::fc_call"); if ((FC_CB_EXEC == cb_type) && (meta != NULL)) { assert (pmeta != NULL); @@ -1430,7 +1429,6 @@ static int fc_call (pTHX_ int type, int cb_type, pfc_user_data_t *data, ...) FREETMPS; LEAVE; - t->running = old_running; va_end (ap); return ret; } /* static int fc_call (int, int, pfc_user_data_t *, ...) */ -- 2.11.0