Merge branch 'collectd-5.5'
authorRuben Kerkhof <ruben@rubenkerkhof.com>
Fri, 3 Jun 2016 10:56:53 +0000 (12:56 +0200)
committerRuben Kerkhof <ruben@rubenkerkhof.com>
Fri, 3 Jun 2016 10:56:53 +0000 (12:56 +0200)
Conflicts:
src/perl.c

1  2 
src/perl.c

diff --combined src/perl.c
@@@ -29,7 -29,7 +29,7 @@@
   * interface for collectd plugins written in perl.
   */
  
- /* do not automatically get the thread specific perl interpreter */
+ /* do not automatically get the thread specific Perl interpreter */
  #define PERL_NO_GET_CONTEXT
  
  #define DONT_POISON_SPRINTF_YET 1
@@@ -123,7 -123,7 +123,7 @@@ static XS (Collectd_call_by_name)
  typedef struct c_ithread_s {
        /* the thread's Perl interpreter */
        PerlInterpreter *interp;
-       _Bool running;  /* thread is inside pi */
+       _Bool running;  /* thread is inside Perl interpreter */
        _Bool shutdown;
        pthread_t pthread;
  
@@@ -305,32 -305,33 +305,32 @@@ static int hv2data_source (pTHX_ HV *ha
        return 0;
  } /* static int hv2data_source (HV *, data_source_t *) */
  
 -static int av2value (pTHX_ char *name, AV *array, value_t *value, int len)
 +/* av2value converts at most "len" elements from "array" to "value". Returns the
 + * number of elements converted or zero on error. */
 +static size_t av2value (pTHX_ char *name, AV *array, value_t *value, size_t array_len)
  {
        const data_set_t *ds;
 +      size_t i;
  
 -      int i = 0;
 -
 -      if ((NULL == name) || (NULL == array) || (NULL == value))
 -              return -1;
 -
 -      if (av_len (array) < len - 1)
 -              len = av_len (array) + 1;
 -
 -      if (0 >= len)
 -              return -1;
 +      if ((NULL == name) || (NULL == array) || (NULL == value) || (array_len == 0))
 +              return 0;
  
        ds = plugin_get_ds (name);
        if (NULL == ds) {
                log_err ("av2value: Unknown dataset \"%s\"", name);
 -              return -1;
 +              return 0;
        }
  
 -      if (ds->ds_num < len) {
 -              log_warn ("av2value: Value length exceeds data set length.");
 -              len = ds->ds_num;
 +      if (array_len < ds->ds_num) {
 +              log_warn ("av2value: array does not contain enough elements for type \"%s\": got %zu, want %zu",
 +                              name, array_len, ds->ds_num);
 +              return 0;
 +      } else if (array_len > ds->ds_num) {
 +              log_warn ("av2value: array contains excess elements for type \"%s\": got %zu, want %zu",
 +                              name, array_len, ds->ds_num);
        }
  
 -      for (i = 0; i < len; ++i) {
 +      for (i = 0; i < ds->ds_num; ++i) {
                SV **tmp = av_fetch (array, i, 0);
  
                if (NULL != tmp) {
                                value[i].absolute = SvIV (*tmp);
                }
                else {
 -                      return -1;
 +                      return 0;
                }
        }
 -      return len;
 -} /* static int av2value (char *, AV *, value_t *, int) */
 +
 +      return ds->ds_num;
 +} /* static size_t av2value (char *, AV *, value_t *, size_t) */
  
  /*
   * value list:
@@@ -384,14 -384,16 +384,14 @@@ static int hv2value_list (pTHX_ HV *has
  
        {
                AV  *array = (AV *)SvRV (*tmp);
 -              int len    = av_len (array) + 1;
 -
 -              if (len <= 0)
 +              /* av_len returns the highest index, not the actual length. */
 +              size_t array_len = (size_t) (av_len (array) + 1);
 +              if (array_len == 0)
                        return -1;
  
 -              vl->values     = (value_t *)smalloc (len * sizeof (value_t));
 -              vl->values_len = av2value (aTHX_ vl->type, (AV *)SvRV (*tmp),
 -                              vl->values, len);
 -
 -              if (-1 == vl->values_len) {
 +              vl->values     = calloc (array_len, sizeof (*vl->values));
 +              vl->values_len = av2value (aTHX_ vl->type, (AV *)SvRV (*tmp), vl->values, array_len);
 +              if (vl->values_len == 0) {
                        sfree (vl->values);
                        return -1;
                }
@@@ -441,7 -443,7 +441,7 @@@ static int av2data_set (pTHX_ AV *array
                return -1;
        }
  
 -      ds->ds = (data_source_t *)smalloc ((len + 1) * sizeof (data_source_t));
 +      ds->ds = smalloc ((len + 1) * sizeof (*ds->ds));
        ds->ds_num = len + 1;
  
        for (i = 0; i <= len; ++i) {
@@@ -505,7 -507,7 +505,7 @@@ static int av2notification_meta (pTHX_ 
  
                hash = (HV *)SvRV (*tmp);
  
 -              *m = (notification_meta_t *)smalloc (sizeof (**m));
 +              *m = smalloc (sizeof (**m));
  
                if (NULL == (tmp = hv_fetch (hash, "name", 4, 0))) {
                        log_warn ("av2notification_meta: Skipping invalid "
@@@ -606,7 -608,7 +606,7 @@@ static int hv2notification (pTHX_ HV *h
  
  static int data_set2av (pTHX_ data_set_t *ds, AV *array)
  {
 -      int i = 0;
 +      size_t i;
  
        if ((NULL == ds) || (NULL == array))
                return -1;
  static int value_list2hv (pTHX_ value_list_t *vl, data_set_t *ds, HV *hash)
  {
        AV *values = NULL;
 -
 -      int i   = 0;
 -      int len = 0;
 +      size_t i;
  
        if ((NULL == vl) || (NULL == ds) || (NULL == hash))
                return -1;
  
 -      len = vl->values_len;
 -
 -      if (ds->ds_num < len) {
 -              log_warn ("value2av: Value length exceeds data set length.");
 -              len = ds->ds_num;
 -      }
 -
        values = newAV ();
 -      av_extend (values, len - 1);
 +      /* av_extend takes the last *index* to which the array should be extended. */
 +      av_extend (values, vl->values_len - 1);
  
 -      for (i = 0; i < len; ++i) {
 +      assert (ds->ds_num == vl->values_len);
 +      for (i = 0; i < vl->values_len; ++i) {
                SV *val = NULL;
  
                if (DS_TYPE_COUNTER == ds->ds[i].type)
@@@ -1175,7 -1184,7 +1175,7 @@@ static int pplugin_call_all (pTHX_ int 
  } /* static int pplugin_call_all (int, ...) */
  
  /*
-  * collectd's perl interpreter based thread implementation.
+  * collectd's Perl interpreter based thread implementation.
   *
   * This has been inspired by Perl's ithreads introduced in version 5.6.0.
   */
@@@ -1248,7 -1257,7 +1248,7 @@@ static c_ithread_t *c_ithread_create (P
  
        assert (NULL != perl_threads);
  
 -      t = (c_ithread_t *)smalloc (sizeof (c_ithread_t));
 +      t = smalloc (sizeof (*t));
        memset (t, 0, sizeof (c_ithread_t));
  
        t->interp = (NULL == base)
@@@ -1461,7 -1470,7 +1461,7 @@@ static int fc_create (int type, const o
                return -1;
        }
  
 -      data = (pfc_user_data_t *)smalloc (sizeof (*data));
 +      data = smalloc (sizeof (*data));
        data->name      = sstrdup (ci->values[0].value.string);
        data->user_data = newSV (0);
  
@@@ -2112,8 -2121,9 +2112,8 @@@ static int perl_flush (cdtime_t timeout
  
  static int perl_shutdown (void)
  {
 -      c_ithread_t *t = NULL;
 -
 -      int ret = 0;
 +      c_ithread_t *t;
 +      int ret;
  
        dTHX;
  
                return 0;
  
        if (NULL == aTHX) {
 -              t = NULL;
 -
                pthread_mutex_lock (&perl_threads->mutex);
                t = c_ithread_create (perl_threads->head->interp);
                pthread_mutex_unlock (&perl_threads->mutex);
  
                thr->shutdown = 1;
                if (thr->running) {
-                       /* Give some time to thread to exit from pi */
-                       WARNING ("perl shutdown: thread is running inside perl. Waiting.");
+                       /* Give some time to thread to exit from Perl interpreter */
+                       WARNING ("perl shutdown: Thread is running inside Perl. Waiting.");
                        ts_wait.tv_sec = 0;
                        ts_wait.tv_nsec = 500000;
                        nanosleep (&ts_wait, NULL);
                }
                if (thr->running) {
-                       ERROR ("perl shutdown: thread hangs inside perl. Thread killed.");
                        pthread_kill (thr->pthread, SIGTERM);
+                       ERROR ("perl shutdown: Thread hangs inside Perl. Thread killed.");
                }
                c_ithread_destroy (thr);
        }
@@@ -2311,7 -2323,7 +2311,7 @@@ static int init_pi (int argc, char **ar
  #endif
        PERL_SYS_INIT3 (&argc, &argv, &environ);
  
 -      perl_threads = (c_ithread_list_t *)smalloc (sizeof (c_ithread_list_t));
 +      perl_threads = smalloc (sizeof (*perl_threads));
        memset (perl_threads, 0, sizeof (c_ithread_list_t));
  
        pthread_mutexattr_init(&perl_threads->mutexattr);
@@@ -2397,7 -2409,7 +2397,7 @@@ static int perl_config_loadplugin (pTHX
  
        aTHX = perl_threads->head->interp;
  
-       log_debug ("perl_config: loading perl plugin \"%s\"", value);
+       log_debug ("perl_config: Loading Perl plugin \"%s\"", value);
        load_module (PERL_LOADMOD_NOIMPORT,
                        newSVpv (module_name, strlen (module_name)), Nullsv);
        return 0;
@@@ -2443,7 -2455,7 +2443,7 @@@ static int perl_config_enabledebugger (
  
        value = ci->values[0].value.string;
  
 -      perl_argv = (char **)realloc (perl_argv,
 +      perl_argv = realloc (perl_argv,
                        (++perl_argc + 1) * sizeof (char *));
  
        if (NULL == perl_argv) {
                perl_argv[perl_argc - 1] = "-d";
        }
        else {
 -              perl_argv[perl_argc - 1] = (char *)smalloc (strlen (value) + 4);
 +              perl_argv[perl_argc - 1] = smalloc (strlen (value) + 4);
                sstrncpy (perl_argv[perl_argc - 1], "-d:", 4);
                sstrncpy (perl_argv[perl_argc - 1] + 3, value, strlen (value) + 1);
        }
@@@ -2480,7 -2492,7 +2480,7 @@@ static int perl_config_includedir (pTHX
        value = ci->values[0].value.string;
  
        if (NULL == aTHX) {
 -              perl_argv = (char **)realloc (perl_argv,
 +              perl_argv = realloc (perl_argv,
                                (++perl_argc + 1) * sizeof (char *));
  
                if (NULL == perl_argv) {
                        exit (3);
                }
  
 -              perl_argv[perl_argc - 1] = (char *)smalloc (strlen (value) + 3);
 +              perl_argv[perl_argc - 1] = smalloc (strlen (value) + 3);
                sstrncpy(perl_argv[perl_argc - 1], "-I", 3);
                sstrncpy(perl_argv[perl_argc - 1] + 2, value, strlen (value) + 1);
  
@@@ -2606,7 -2618,7 +2606,7 @@@ static int perl_config (oconfig_item_t 
  void module_register (void)
  {
        perl_argc = 4;
 -      perl_argv = (char **)smalloc ((perl_argc + 1) * sizeof (char *));
 +      perl_argv = smalloc ((perl_argc + 1) * sizeof (*perl_argv));
  
        /* default options for the Perl interpreter */
        perl_argv[0] = "";