Merge branch 'collectd-4.3' into collectd-4.4
authorFlorian Forster <octo@leeloo.lan.home.verplant.org>
Tue, 15 Jul 2008 14:32:37 +0000 (16:32 +0200)
committerFlorian Forster <octo@leeloo.lan.home.verplant.org>
Tue, 15 Jul 2008 14:32:37 +0000 (16:32 +0200)
1  2 
src/perl.c

diff --combined src/perl.c
  /* do not automatically get the thread specific perl interpreter */
  #define PERL_NO_GET_CONTEXT
  
+ #define DONT_POISON_SPRINTF_YET 1
  #include "collectd.h"
+ #undef DONT_POISON_SPRINTF_YET
  
  #include "configfile.h"
  
  #include <EXTERN.h>
  #include <perl.h>
  
+ #if __GNUC__
+ # pragma GCC poison sprintf
+ #endif
  #include <XSUB.h>
  
  /* Some versions of Perl define their own version of DEBUG... :-/ */
@@@ -61,9 -67,8 +67,9 @@@
  #define PLUGIN_SHUTDOWN 3
  #define PLUGIN_LOG      4
  #define PLUGIN_NOTIF    5
 +#define PLUGIN_FLUSH    6
  
 -#define PLUGIN_TYPES    6
 +#define PLUGIN_TYPES    7
  
  #define PLUGIN_DATASET  255
  
@@@ -78,8 -83,6 +84,8 @@@ void boot_DynaLoader (PerlInterpreter *
  static XS (Collectd_plugin_register_ds);
  static XS (Collectd_plugin_unregister_ds);
  static XS (Collectd_plugin_dispatch_values);
 +static XS (Collectd_plugin_flush_one);
 +static XS (Collectd_plugin_flush_all);
  static XS (Collectd_plugin_dispatch_notification);
  static XS (Collectd_plugin_log);
  static XS (Collectd_call_by_name);
@@@ -133,8 -136,6 +139,8 @@@ static struct 
        { "Collectd::plugin_register_data_set",   Collectd_plugin_register_ds },
        { "Collectd::plugin_unregister_data_set", Collectd_plugin_unregister_ds },
        { "Collectd::plugin_dispatch_values",     Collectd_plugin_dispatch_values },
 +      { "Collectd::plugin_flush_one",           Collectd_plugin_flush_one },
 +      { "Collectd::plugin_flush_all",           Collectd_plugin_flush_all },
        { "Collectd::plugin_dispatch_notification",
                Collectd_plugin_dispatch_notification },
        { "Collectd::plugin_log",                 Collectd_plugin_log },
@@@ -153,7 -154,6 +159,7 @@@ struct 
        { "Collectd::TYPE_SHUTDOWN",   PLUGIN_SHUTDOWN },
        { "Collectd::TYPE_LOG",        PLUGIN_LOG },
        { "Collectd::TYPE_NOTIF",      PLUGIN_NOTIF },
 +      { "Collectd::TYPE_FLUSH",      PLUGIN_FLUSH },
        { "Collectd::TYPE_DATASET",    PLUGIN_DATASET },
        { "Collectd::DS_TYPE_COUNTER", DS_TYPE_COUNTER },
        { "Collectd::DS_TYPE_GAUGE",   DS_TYPE_GAUGE },
@@@ -761,12 -761,6 +767,12 @@@ static int pplugin_call_all (pTHX_ int 
  
                XPUSHs (sv_2mortal (newRV_noinc ((SV *)notif)));
        }
 +      else if (PLUGIN_FLUSH == type) {
 +              /*
 +               * $_[0] = $timeout;
 +               */
 +              XPUSHs (sv_2mortal (newSViv (va_arg (ap, int))));
 +      }
  
        PUTBACK;
  
@@@ -903,54 -897,6 +909,54 @@@ static XS (Collectd_plugin_dispatch_val
  } /* static XS (Collectd_plugin_dispatch_values) */
  
  /*
 + * Collectd::plugin_flush_one (timeout, name).
 + *
 + * timeout:
 + *   timeout to use when flushing the data
 + *
 + * name:
 + *   name of the plugin to flush
 + */
 +static XS (Collectd_plugin_flush_one)
 +{
 +      dXSARGS;
 +
 +      if (2 != items) {
 +              log_err ("Usage: Collectd::plugin_flush_one(timeout, name)");
 +              XSRETURN_EMPTY;
 +      }
 +
 +      log_debug ("Collectd::plugin_flush_one: timeout = %i, name = \"%s\"",
 +                      (int)SvIV (ST (0)), SvPV_nolen (ST (1)));
 +
 +      if (0 == plugin_flush_one ((int)SvIV (ST (0)), SvPV_nolen (ST (1))))
 +              XSRETURN_YES;
 +      else
 +              XSRETURN_EMPTY;
 +} /* static XS (Collectd_plugin_flush_one) */
 +
 +/*
 + * Collectd::plugin_flush_all (timeout).
 + *
 + * timeout:
 + *   timeout to use when flushing the data
 + */
 +static XS (Collectd_plugin_flush_all)
 +{
 +      dXSARGS;
 +
 +      if (1 != items) {
 +              log_err ("Usage: Collectd::plugin_flush_all(timeout)");
 +              XSRETURN_EMPTY;
 +      }
 +
 +      log_debug ("Collectd::plugin_flush_all: timeout = %i", (int)SvIV (ST (0)));
 +
 +      plugin_flush_all ((int)SvIV (ST (0)));
 +      XSRETURN_YES;
 +} /* static XS (Collectd_plugin_flush_all) */
 +
 +/*
   * Collectd::plugin_dispatch_notification (notif).
   *
   * notif:
@@@ -1118,7 -1064,7 +1124,7 @@@ static c_ithread_t *c_ithread_create (P
  
        aTHX = t->interp;
  
 -      if (NULL != base) {
 +      if ((NULL != base) && (NULL != PL_endav)) {
                av_clear (PL_endav);
                av_undef (PL_endav);
                PL_endav = Nullav;
@@@ -1255,25 -1201,6 +1261,25 @@@ static int perl_notify (const notificat
        return pplugin_call_all (aTHX_ PLUGIN_NOTIF, notif);
  } /* static int perl_notify (const notification_t *) */
  
 +static int perl_flush (const int timeout)
 +{
 +      dTHX;
 +
 +      if (NULL == perl_threads)
 +              return 0;
 +
 +      if (NULL == aTHX) {
 +              c_ithread_t *t = NULL;
 +
 +              pthread_mutex_lock (&perl_threads->mutex);
 +              t = c_ithread_create (perl_threads->head->interp);
 +              pthread_mutex_unlock (&perl_threads->mutex);
 +
 +              aTHX = t->interp;
 +      }
 +      return pplugin_call_all (aTHX_ PLUGIN_FLUSH, timeout);
 +} /* static int perl_flush (const int) */
 +
  static int perl_shutdown (void)
  {
        c_ithread_t *t = NULL;
        plugin_unregister_init ("perl");
        plugin_unregister_read ("perl");
        plugin_unregister_write ("perl");
 +      plugin_unregister_flush ("perl");
  
        ret = pplugin_call_all (aTHX_ PLUGIN_SHUTDOWN);
  
@@@ -1441,7 -1367,7 +1447,7 @@@ static int init_pi (int argc, char **ar
                log_err ("init_pi: pthread_key_create failed");
  
                /* this must not happen - cowardly giving up if it does */
 -              exit (1);
 +              return -1;
        }
  
  #ifdef __FreeBSD__
  
        if (0 != perl_parse (aTHX_ xs_init, argc, argv, NULL)) {
                log_err ("init_pi: Unable to bootstrap Collectd.");
 -              exit (1);
 +
 +              perl_destruct (perl_threads->head->interp);
 +              perl_free (perl_threads->head->interp);
 +              sfree (perl_threads);
 +
 +              pthread_key_delete (perl_thr_key);
 +              return -1;
        }
  
        /* Set $0 to "collectd" because perl_parse() has to set it to "-e". */
        plugin_register_read ("perl", perl_read);
  
        plugin_register_write ("perl", perl_write);
 +      plugin_register_flush ("perl", perl_flush);
        plugin_register_shutdown ("perl", perl_shutdown);
        return 0;
  } /* static int init_pi (const char **, const int) */
@@@ -1524,9 -1443,7 +1530,9 @@@ static int perl_config_loadplugin (pTHX
                return (1);
        }
  
 -      init_pi (perl_argc, perl_argv);
 +      if (0 != init_pi (perl_argc, perl_argv))
 +              return -1;
 +
        assert (NULL != perl_threads);
        assert (NULL != perl_threads->head);