X-Git-Url: https://git.octo.it/?a=blobdiff_plain;f=src%2Fpython.c;h=a3027e0dd36212cbdc6845b85cabaf0f878f398c;hb=965246d5039b0e6689398752f5c9771a844b491b;hp=d193d2d127574713e75e9d2c1db6633f48243d1c;hpb=f7cf0dad2e933ac6066ca5f27645ee577f065710;p=collectd.git diff --git a/src/python.c b/src/python.c index d193d2d1..a3027e0d 100644 --- a/src/python.c +++ b/src/python.c @@ -335,7 +335,7 @@ static int cpy_read_callback(user_data_t *data) { static int cpy_write_callback(const data_set_t *ds, const value_list_t *value_list, user_data_t *data) { int i; cpy_callback_t *c = data->data; - PyObject *ret, *list, *temp, *dict = NULL; + PyObject *ret, *list, *temp, *dict = NULL, *val; Values *v; CPY_LOCK_THREADS @@ -371,6 +371,7 @@ static int cpy_write_callback(const data_set_t *ds, const value_list_t *value_li } if (PyErr_Occurred() != NULL) { cpy_log_exception("value building for write callback"); + Py_DECREF(list); CPY_RETURN_FROM_THREADS 0; } } @@ -419,26 +420,29 @@ static int cpy_write_callback(const data_set_t *ds, const value_list_t *value_li if (meta_data_get_boolean(meta, table[i], &b)) continue; if (b) - temp = Py_True; + PyDict_SetItemString(dict, table[i], Py_True); else - temp = Py_False; - PyDict_SetItemString(dict, table[i], temp); + PyDict_SetItemString(dict, table[i], Py_False); } free(table[i]); } free(table); } - v = PyObject_New(Values, (void *) &ValuesType); + val = Values_New(); /* New reference. */ + v = (Values *) val; sstrncpy(v->data.host, value_list->host, sizeof(v->data.host)); sstrncpy(v->data.type, value_list->type, sizeof(v->data.type)); sstrncpy(v->data.type_instance, value_list->type_instance, sizeof(v->data.type_instance)); sstrncpy(v->data.plugin, value_list->plugin, sizeof(v->data.plugin)); sstrncpy(v->data.plugin_instance, value_list->plugin_instance, sizeof(v->data.plugin_instance)); - v->data.time = value_list->time; - v->interval = value_list->interval; + v->data.time = CDTIME_T_TO_DOUBLE(value_list->time); + v->interval = CDTIME_T_TO_DOUBLE(value_list->interval); + Py_CLEAR(v->values); v->values = list; + Py_CLEAR(v->meta); v->meta = dict; ret = PyObject_CallFunctionObjArgs(c->callback, v, c->data, (void *) 0); /* New reference. */ + Py_XDECREF(val); if (ret == NULL) { cpy_log_exception("write callback"); } else { @@ -450,20 +454,22 @@ static int cpy_write_callback(const data_set_t *ds, const value_list_t *value_li static int cpy_notification_callback(const notification_t *notification, user_data_t *data) { cpy_callback_t *c = data->data; - PyObject *ret; + PyObject *ret, *notify; Notification *n; CPY_LOCK_THREADS - n = PyObject_New(Notification, (void *) &NotificationType); + notify = Notification_New(); /* New reference. */ + n = (Notification *) notify; sstrncpy(n->data.host, notification->host, sizeof(n->data.host)); sstrncpy(n->data.type, notification->type, sizeof(n->data.type)); sstrncpy(n->data.type_instance, notification->type_instance, sizeof(n->data.type_instance)); sstrncpy(n->data.plugin, notification->plugin, sizeof(n->data.plugin)); sstrncpy(n->data.plugin_instance, notification->plugin_instance, sizeof(n->data.plugin_instance)); - n->data.time = notification->time; + n->data.time = CDTIME_T_TO_DOUBLE(notification->time); sstrncpy(n->message, notification->message, sizeof(n->message)); n->severity = notification->severity; ret = PyObject_CallFunctionObjArgs(c->callback, n, c->data, (void *) 0); /* New reference. */ + Py_XDECREF(notify); if (ret == NULL) { cpy_log_exception("notification callback"); } else { @@ -623,7 +629,8 @@ static PyObject *cpy_register_read(PyObject *self, PyObject *args, PyObject *kwd user_data->data = c; ts.tv_sec = interval; ts.tv_nsec = (interval - ts.tv_sec) * 1000000000; - plugin_register_complex_read(buf, cpy_read_callback, &ts, user_data); + plugin_register_complex_read(/* group = */ NULL, buf, + cpy_read_callback, &ts, user_data); return cpy_string_to_unicode_or_bytes(buf); } @@ -896,6 +903,11 @@ static int cpy_init(void) { static pthread_t thread; sigset_t sigset; + if (!Py_IsInitialized()) { + WARNING("python: Plugin loaded but not configured."); + plugin_unregister_shutdown("python"); + return 0; + } PyEval_InitThreads(); /* Now it's finally OK to use python threads. */ for (c = cpy_init_callbacks; c; c = c->next) {