*
* Authors:
* Sebastian Harl <sh at tokkee.org>
+ * Pavel Rochnyak <pavel2000 ngs.ru>
**/
/*
#define PLUGIN_LOG 4
#define PLUGIN_NOTIF 5
#define PLUGIN_FLUSH 6
+#define PLUGIN_FLUSH_ALL 7 /* For collectd-5.6 only */
-#define PLUGIN_TYPES 7
+#define PLUGIN_TYPES 8
#define PLUGIN_CONFIG 254
#define PLUGIN_DATASET 255
* private variables
*/
+static _Bool register_legacy_flush = 1;
+
/* if perl_threads != NULL perl_threads->head must
* point to the "base" thread */
static c_ithread_list_t *perl_threads = NULL;
XPUSHs (sv_2mortal (newSVnv (CDTIME_T_TO_DOUBLE (timeout))));
XPUSHs (sv_2mortal (newSVpv (va_arg (ap, char *), 0)));
}
+ else if (PLUGIN_FLUSH_ALL == type) {
+ cdtime_t timeout;
+ subname = "Collectd::plugin_call_all";
+ /*
+ * $_[0] = $timeout;
+ * $_[1] = $identifier;
+ */
+ timeout = va_arg (ap, cdtime_t);
+
+ XPUSHs (sv_2mortal (newSViv ((IV)PLUGIN_FLUSH)));
+ XPUSHs (sv_2mortal (newSVnv (CDTIME_T_TO_DOUBLE (timeout))));
+ XPUSHs (sv_2mortal (newSVpv (va_arg (ap, char *), 0)));
+ }
else if (PLUGIN_INIT == type) {
subname = "Collectd::plugin_call_all";
XPUSHs (sv_2mortal (newSViv ((IV)type)));
assert (NULL != perl_threads);
PERL_SET_CONTEXT (aTHX);
+ /* Mark as running to avoid deadlock:
+ c_ithread_destroy -> log_debug -> perl_log()
+ */
+ ithread->running = 1;
log_debug ("Shutting down Perl interpreter %p...", aTHX);
#if COLLECT_DEBUG
{
int ret = 0;
user_data_t userdata;
- char cb_name[DATA_MAX_NAME_LEN];
+ char *pluginname;
dXSARGS;
XSRETURN_EMPTY;
}
+ /* Use pluginname as-is to allow flush a single perl plugin */
+ pluginname = SvPV_nolen (ST (0));
+
log_debug ("Collectd::plugin_register_%s: "
"plugin = \"%s\", sub = \"%s\"",
- desc, SvPV_nolen (ST (0)), SvPV_nolen (ST (1)));
+ desc, pluginname, SvPV_nolen (ST (1)));
- ssnprintf (cb_name, sizeof (cb_name), "perl/%s", SvPV_nolen (ST (0)));
memset(&userdata, 0, sizeof(userdata));
userdata.data = strdup(SvPV_nolen (ST (1)));
userdata.free_func = free;
if (PLUGIN_READ == type) {
ret = plugin_register_complex_read(
"perl", /* group */
- cb_name,
+ pluginname,
perl_read,
plugin_get_interval(), /* Default interval */
&userdata);
}
else if (PLUGIN_WRITE == type) {
- ret = plugin_register_write(cb_name, perl_write, &userdata);
+ ret = plugin_register_write(pluginname, perl_write, &userdata);
}
else if (PLUGIN_LOG == type) {
- ret = plugin_register_log(cb_name, perl_log, &userdata);
+ ret = plugin_register_log(pluginname, perl_log, &userdata);
}
else if (PLUGIN_NOTIF == type) {
- ret = plugin_register_notification(cb_name, perl_notify, &userdata);
+ ret = plugin_register_notification(pluginname, perl_notify, &userdata);
}
else if (PLUGIN_FLUSH == type) {
- ret = plugin_register_flush(cb_name, perl_flush, &userdata);
+ if (1 == register_legacy_flush) { /* For collectd-5.7 only, #1731 */
+ register_legacy_flush = 0;
+ ret = plugin_register_flush("perl", perl_flush, /* user_data = */ NULL);
+ }
+
+ if (0 == ret)
+ ret = plugin_register_flush(pluginname, perl_flush, &userdata);
}
else {
ret = -1;
static void _plugin_unregister_generic (pTHX,
perl_unregister_function_t *unreg, const char *desc)
{
- char cb_name[DATA_MAX_NAME_LEN];
-
dXSARGS;
if (1 != items) {
log_debug ("Collectd::plugin_unregister_%s: plugin = \"%s\"",
desc, SvPV_nolen (ST (0)));
- ssnprintf (cb_name, sizeof (cb_name), "perl/%s", SvPV_nolen (ST (0)));
-
- unreg(cb_name);
+ unreg(SvPV_nolen (ST (0)));
XSRETURN_EMPTY;
aTHX = t->interp;
}
+
+ /* For collectd-5.6 only, #1731 */
+ if (user_data == NULL || user_data->data == NULL)
+ return pplugin_call (aTHX_ PLUGIN_FLUSH_ALL, timeout, identifier);
+
return pplugin_call (aTHX_ PLUGIN_FLUSH, user_data->data, timeout, identifier);
} /* static int perl_flush (const int) */
aTHX, perl_threads->number_of_threads);
plugin_unregister_init ("perl");
+ plugin_unregister_flush ("perl"); /* For collectd-5.6 only, #1731 */
ret = pplugin_call (aTHX_ PLUGIN_SHUTDOWN);
pthread_kill (thr->pthread, SIGTERM);
ERROR ("perl shutdown: Thread hangs inside Perl. Thread killed.");
}
- /* Mark as running to avoid deadlock:
- c_ithread_destroy -> log_debug -> perl_log()
- */
- thr->running = 1;
c_ithread_destroy (thr);
}
current_status = perl_config_includedir (aTHX_ c);
else if (0 == strcasecmp (c->key, "Plugin"))
current_status = perl_config_plugin (aTHX_ c);
+ else if (0 == strcasecmp (c->key, "RegisterLegacyFlush"))
+ cf_util_get_boolean (c, ®ister_legacy_flush);
else
{
log_warn ("Ignoring unknown config key \"%s\".", c->key);