summary | shortlog | log | commit | commitdiff | tree
raw | patch | inline | side by side (parent: adcc466)
raw | patch | inline | side by side (parent: adcc466)
author | Sven Trenkel <collectd@semidefinite.de> | |
Sat, 5 Dec 2009 15:27:49 +0000 (16:27 +0100) | ||
committer | Sven Trenkel <collectd@semidefinite.de> | |
Sat, 5 Dec 2009 15:27:49 +0000 (16:27 +0100) |
src/collectd-python.pod | patch | blob | history | |
src/python.c | patch | blob | history |
index b6a0b0c0fc7e48da181055e8cf52a44b29d5e035..c07ebf961dd2ce5bfab3f0e821845e84cf18ecf1 100644 (file)
--- a/src/collectd-python.pod
+++ b/src/collectd-python.pod
B<register_config> method - see below.
Python thread support has not been initialized at this point so do not use any
-threading functions at this point!
+threading functions here!
=item init functions
@@ -381,13 +381,11 @@ I<data> is an optional object that will be passed back to the callback function
every time it is called. If you obmit this parameter no object is
passed back to your callback, not even None.
I<name> is an optional identifier for this callback. The default name is
- B<python>.I<module>.I<name>'. I<module> and I<name> are taken from the
- B<__module__> and B<__name__> attributes of your callback function. If
- the parameter I<name> contains a B<.>' it replaces both I<module> and
- I<name>, otherwise it replaces only I<name>.
+ B<python>.I<module>. I<module> is taken from the B<__module__>
+ attribute of your callback function.
Every callback needs a unique identifier, so if you want to register
- one function multiple time you need to specify a name here. Otherwise
- it's save to ignore this parameter
+ the same callback multiple time in the same module you need to specify
+ a name here. Otherwise it's save to ignore this parameter
I<identifier> is the full identifier assigned to this callback.
These functions are called in the various stages of the daemon (see the
@@ -402,9 +400,7 @@ The only argument passed is a I<Config> object. See above for the layout of this
data type.
Note that you can not receive the whole config files this way, only B<Module>
blocks inside the Python configuration block. Additionally you will only
-receive blocks where your callback identifier matches B<python.>I<blockname>. In
-order for this to work the way the identifier is constructed is shortened to
-not have a I<name> part.
+receive blocks where your callback identifier matches B<python.>I<blockname>.
=item register_init
=item register_flush
-Like B<register_config> the identifier is shortened because it determines what
-flush requests the plugin will receive.
+Like B<register_config> is important for this callbavk because it determines
+what flush requests the plugin will receive.
The arguments passed are I<timeout> and I<identifier>. I<timeout> indicates
that only data older than I<timeout> seconds is to be flushed. I<identifier>
diff --git a/src/python.c b/src/python.c
index ea25829d63226d9f56f160be5f2052a530b98c25..cdc6d26d49ec06c8f5630bc509097f43915d36da 100644 (file)
--- a/src/python.c
+++ b/src/python.c
@@ -36,11 +36,10 @@ static char reg_log_doc[] = "register_log(callback[, data][, name]) -> identifie
"'data' is an optional object that will be passed back to the callback\n"
" function every time it is called.\n"
"'name' is an optional identifier for this callback. The default name\n"
- " is 'python.<module>.<name>'. If 'name' contains a '.' it\n"
- " replaces both module and name, otherwise it replaces only name.\n"
+ " is 'python.<module>'.\n"
" Every callback needs a unique identifier, so if you want to\n"
- " register one function multiple time you need to specify a name\n"
- " here.\n"
+ " register this callback multiple time from the same module you need\n"
+ " to specify a name here.\n"
"'identifier' is the full identifier assigned to this callback.\n"
"\n"
"The callback function will be called with two or three parameters:\n"
@@ -59,11 +58,10 @@ static char reg_init_doc[] = "register_init(callback[, data][, name]) -> identif
"'data' is an optional object that will be passed back to the callback\n"
" function when it is called.\n"
"'name' is an optional identifier for this callback. The default name\n"
- " is 'python.<module>.<name>'. If 'name' contains a '.' it\n"
- " replaces both module and name, otherwise it replaces only name.\n"
+ " is 'python.<module>'.\n"
" Every callback needs a unique identifier, so if you want to\n"
- " register one function multiple time you need to specify a name\n"
- " here.\n"
+ " register this callback multiple time from the same module you need\n"
+ " to specify a name here.\n"
"'identifier' is the full identifier assigned to this callback.\n"
"\n"
"The callback function will be called without parameters, except for\n"
"'data' is an optional object that will be passed back to the callback\n"
" function every time it is called.\n"
"'name' is an optional identifier for this callback. The default name\n"
- " is 'python.<module>'. Every callback needs a unique identifier,\n"
- " so if you want to register one function multiple time you need to\n"
- " specify a name here.\n"
+ " is 'python.<module>'.\n"
+ " Every callback needs a unique identifier, so if you want to\n"
+ " register this callback multiple time from the same module you need\n"
+ " to specify a name here.\n"
"'identifier' is the full identifier assigned to this callback.\n"
"\n"
"The callback function will be called with one or two parameters:\n"
@@ -97,11 +96,10 @@ static char reg_read_doc[] = "register_read(callback[, interval][, data][, name]
"'data' is an optional object that will be passed back to the callback\n"
" function every time it is called.\n"
"'name' is an optional identifier for this callback. The default name\n"
- " is 'python.<module>.<name>'. If 'name' contains a '.' it\n"
- " replaces both module and name, otherwise it replaces only name.\n"
+ " is 'python.<module>'.\n"
" Every callback needs a unique identifier, so if you want to\n"
- " register one function multiple time you need to specify a name\n"
- " here.\n"
+ " register this callback multiple time from the same module you need\n"
+ " to specify a name here.\n"
"'identifier' is the full identifier assigned to this callback.\n"
"\n"
"The callback function will be called without parameters, except for\n"
@@ -115,11 +113,10 @@ static char reg_write_doc[] = "register_write(callback[, data][, name]) -> ident
"'data' is an optional object that will be passed back to the callback\n"
" function every time it is called.\n"
"'name' is an optional identifier for this callback. The default name\n"
- " is 'python.<module>.<name>'. If 'name' contains a '.' it\n"
- " replaces both module and name, otherwise it replaces only name.\n"
+ " is 'python.<module>'.\n"
" Every callback needs a unique identifier, so if you want to\n"
- " register one function multiple time you need to specify a name\n"
- " here.\n"
+ " register this callback multiple time from the same module you need\n"
+ " to specify a name here.\n"
"'identifier' is the full identifier assigned to this callback.\n"
"\n"
"The callback function will be called with one or two parameters:\n"
@@ -135,11 +132,10 @@ static char reg_notification_doc[] = "register_notification(callback[, data][, n
"'data' is an optional object that will be passed back to the callback\n"
" function every time it is called.\n"
"'name' is an optional identifier for this callback. The default name\n"
- " is 'python.<module>.<name>'. If 'name' contains a '.' it\n"
- " replaces both module and name, otherwise it replaces only name.\n"
+ " is 'python.<module>'.\n"
" Every callback needs a unique identifier, so if you want to\n"
- " register one function multiple time you need to specify a name\n"
- " here.\n"
+ " register this callback multiple time from the same module you need\n"
+ " to specify a name here.\n"
"'identifier' is the full identifier assigned to this callback.\n"
"\n"
"The callback function will be called with one or two parameters:\n"
@@ -155,9 +151,10 @@ static char reg_flush_doc[] = "register_flush(callback[, data][, name]) -> ident
"'data' is an optional object that will be passed back to the callback\n"
" function every time it is called.\n"
"'name' is an optional identifier for this callback. The default name\n"
- " is 'python.<module>'. Every callback needs a unique identifier,\n"
- " so if you want to register one function multiple time you need to\n"
- " specify a name here.\n"
+ " is 'python.<module>'.\n"
+ " Every callback needs a unique identifier, so if you want to\n"
+ " register this callback multiple time from the same module you need\n"
+ " to specify a name here.\n"
"'identifier' is the full identifier assigned to this callback.\n"
"\n"
"The callback function will be called with two or three parameters:\n"
@@ -175,11 +172,10 @@ static char reg_shutdown_doc[] = "register_shutdown(callback[, data][, name]) ->
"'data' is an optional object that will be passed back to the callback\n"
" function if it is called.\n"
"'name' is an optional identifier for this callback. The default name\n"
- " is 'python.<module>.<name>'. If 'name' contains a '.' it\n"
- " replaces both module and name, otherwise it replaces only name.\n"
+ " is 'python.<module>'.\n"
" Every callback needs a unique identifier, so if you want to\n"
- " register one function multiple time you need to specify a name\n"
- " here.\n"
+ " register this callback multiple time from the same module you need\n"
+ " to specify a name here.\n"
"'identifier' is the full identifier assigned to this callback.\n"
"\n"
"The callback function will be called with no parameters except for\n"
/* You must hold the GIL to call this function!
* But if you managed to extract the callback parameter then you probably already do. */
-static void cpy_build_name(char *buf, size_t size, PyObject *callback, const char *name, int short_name) {
- const char *module;
- PyObject *mod = NULL, *n = NULL;
+static void cpy_build_name(char *buf, size_t size, PyObject *callback, const char *name) {
+ const char *module = NULL;
+ PyObject *mod = NULL;
- if (name != NULL && (strchr(name, '.') != NULL || short_name)) {
+ if (name != NULL) {
snprintf(buf, size, "python.%s", name);
return;
}
@@ -224,31 +220,15 @@ static void cpy_build_name(char *buf, size_t size, PyObject *callback, const cha
mod = PyObject_GetAttrString(callback, "__module__"); /* New reference. */
if (mod != NULL)
module = PyString_AsString(mod);
- else
- module = "collectd";
- if (short_name) {
+ if (module != NULL) {
snprintf(buf, size, "python.%s", module);
Py_XDECREF(mod);
return;
}
-
- if (name != NULL) {
- snprintf(buf, size, "python.%s.%s", module, name);
- Py_XDECREF(mod);
- return;
- }
-
- n = PyObject_GetAttrString(callback, "__name__"); /* New reference. */
- if (n != NULL)
- name = PyString_AsString(n);
-
- if (name != NULL)
- snprintf(buf, size, "python.%s.%s", module, name);
- else
- snprintf(buf, size, "python.%s.%p", module, callback);
Py_XDECREF(mod);
- Py_XDECREF(n);
+
+ snprintf(buf, size, "python.%p", callback);
}
static void cpy_log_exception(const char *context) {
@@ -437,7 +417,7 @@ static void cpy_flush_callback(int timeout, const char *id, user_data_t *data) {
CPY_RELEASE_THREADS
}
-static PyObject *cpy_register_generic(cpy_callback_t **list_head, PyObject *args, PyObject *kwds, int short_name) {
+static PyObject *cpy_register_generic(cpy_callback_t **list_head, PyObject *args, PyObject *kwds) {
char buf[512];
cpy_callback_t *c;
const char *name = NULL;
@@ -449,7 +429,7 @@ static PyObject *cpy_register_generic(cpy_callback_t **list_head, PyObject *args
PyErr_SetString(PyExc_TypeError, "callback needs a be a callable object.");
return NULL;
}
- cpy_build_name(buf, sizeof(buf), callback, name, short_name);
+ cpy_build_name(buf, sizeof(buf), callback, name);
Py_INCREF(callback);
Py_XINCREF(data);
@@ -476,16 +456,16 @@ static PyObject *cpy_flush(cpy_callback_t **list_head, PyObject *args, PyObject
}
static PyObject *cpy_register_config(PyObject *self, PyObject *args, PyObject *kwds) {
- return cpy_register_generic(&cpy_config_callbacks, args, kwds, 1);
+ return cpy_register_generic(&cpy_config_callbacks, args, kwds);
}
static PyObject *cpy_register_init(PyObject *self, PyObject *args, PyObject *kwds) {
- return cpy_register_generic(&cpy_init_callbacks, args, kwds, 0);
+ return cpy_register_generic(&cpy_init_callbacks, args, kwds);
}
typedef int reg_function_t(const char *name, void *callback, void *data);
-static PyObject *cpy_register_generic_userdata(void *reg, void *handler, PyObject *args, PyObject *kwds, int short_name) {
+static PyObject *cpy_register_generic_userdata(void *reg, void *handler, PyObject *args, PyObject *kwds) {
char buf[512];
reg_function_t *register_function = (reg_function_t *) reg;
cpy_callback_t *c = NULL;
@@ -499,7 +479,7 @@ static PyObject *cpy_register_generic_userdata(void *reg, void *handler, PyObjec
PyErr_SetString(PyExc_TypeError, "callback needs a be a callable object.");
return NULL;
}
- cpy_build_name(buf, sizeof(buf), callback, name, short_name);
+ cpy_build_name(buf, sizeof(buf), callback, name);
Py_INCREF(callback);
Py_XINCREF(data);
@@ -530,7 +510,7 @@ static PyObject *cpy_register_read(PyObject *self, PyObject *args, PyObject *kwd
PyErr_SetString(PyExc_TypeError, "callback needs a be a callable object.");
return NULL;
}
- cpy_build_name(buf, sizeof(buf), callback, name, 0);
+ cpy_build_name(buf, sizeof(buf), callback, name);
Py_INCREF(callback);
Py_XINCREF(data);
@@ -549,23 +529,23 @@ static PyObject *cpy_register_read(PyObject *self, PyObject *args, PyObject *kwd
}
static PyObject *cpy_register_log(PyObject *self, PyObject *args, PyObject *kwds) {
- return cpy_register_generic_userdata(plugin_register_log, cpy_log_callback, args, kwds, 0);
+ return cpy_register_generic_userdata(plugin_register_log, cpy_log_callback, args, kwds);
}
static PyObject *cpy_register_write(PyObject *self, PyObject *args, PyObject *kwds) {
- return cpy_register_generic_userdata(plugin_register_write, cpy_write_callback, args, kwds, 0);
+ return cpy_register_generic_userdata(plugin_register_write, cpy_write_callback, args, kwds);
}
static PyObject *cpy_register_notification(PyObject *self, PyObject *args, PyObject *kwds) {
- return cpy_register_generic_userdata(plugin_register_notification, cpy_notification_callback, args, kwds, 0);
+ return cpy_register_generic_userdata(plugin_register_notification, cpy_notification_callback, args, kwds);
}
static PyObject *cpy_register_flush(PyObject *self, PyObject *args, PyObject *kwds) {
- return cpy_register_generic_userdata(plugin_register_flush, cpy_flush_callback, args, kwds, 1);
+ return cpy_register_generic_userdata(plugin_register_flush, cpy_flush_callback, args, kwds);
}
static PyObject *cpy_register_shutdown(PyObject *self, PyObject *args, PyObject *kwds) {
- return cpy_register_generic(&cpy_shutdown_callbacks, args, kwds, 0);
+ return cpy_register_generic(&cpy_shutdown_callbacks, args, kwds);
}
static PyObject *cpy_error(PyObject *self, PyObject *args) {
Py_RETURN_NONE;
}
-static PyObject *cpy_unregister_generic(cpy_callback_t **list_head, PyObject *arg, const char *desc, int short_name) {
+static PyObject *cpy_unregister_generic(cpy_callback_t **list_head, PyObject *arg, const char *desc) {
char buf[512];
const char *name;
cpy_callback_t *prev = NULL, *tmp;
@@ -627,7 +607,7 @@ static PyObject *cpy_unregister_generic(cpy_callback_t **list_head, PyObject *ar
PyErr_SetString(PyExc_TypeError, "This function needs a string or a callable object as its only parameter.");
return NULL;
}
- cpy_build_name(buf, sizeof(buf), arg, NULL, short_name);
+ cpy_build_name(buf, sizeof(buf), arg, NULL);
name = buf;
}
for (tmp = *list_head; tmp; prev = tmp, tmp = tmp->next)
@@ -650,7 +630,7 @@ static PyObject *cpy_unregister_generic(cpy_callback_t **list_head, PyObject *ar
typedef int cpy_unregister_function_t(const char *name);
-static PyObject *cpy_unregister_generic_userdata(cpy_unregister_function_t *unreg, PyObject *arg, const char *desc, int short_name) {
+static PyObject *cpy_unregister_generic_userdata(cpy_unregister_function_t *unreg, PyObject *arg, const char *desc) {
char buf[512];
const char *name;
@@ -661,7 +641,7 @@ static PyObject *cpy_unregister_generic_userdata(cpy_unregister_function_t *unre
PyErr_SetString(PyExc_TypeError, "This function needs a string or a callable object as its only parameter.");
return NULL;
}
- cpy_build_name(buf, sizeof(buf), arg, NULL, short_name);
+ cpy_build_name(buf, sizeof(buf), arg, NULL);
name = buf;
}
if (unreg(name) == 0)
@@ -671,35 +651,35 @@ static PyObject *cpy_unregister_generic_userdata(cpy_unregister_function_t *unre
}
static PyObject *cpy_unregister_log(PyObject *self, PyObject *arg) {
- return cpy_unregister_generic_userdata(plugin_unregister_log, arg, "log", 0);
+ return cpy_unregister_generic_userdata(plugin_unregister_log, arg, "log");
}
static PyObject *cpy_unregister_init(PyObject *self, PyObject *arg) {
- return cpy_unregister_generic(&cpy_init_callbacks, arg, "init", 0);
+ return cpy_unregister_generic(&cpy_init_callbacks, arg, "init");
}
static PyObject *cpy_unregister_config(PyObject *self, PyObject *arg) {
- return cpy_unregister_generic(&cpy_config_callbacks, arg, "config", 1);
+ return cpy_unregister_generic(&cpy_config_callbacks, arg, "config");
}
static PyObject *cpy_unregister_read(PyObject *self, PyObject *arg) {
- return cpy_unregister_generic_userdata(plugin_unregister_read, arg, "read", 0);
+ return cpy_unregister_generic_userdata(plugin_unregister_read, arg, "read");
}
static PyObject *cpy_unregister_write(PyObject *self, PyObject *arg) {
- return cpy_unregister_generic_userdata(plugin_unregister_write, arg, "write", 0);
+ return cpy_unregister_generic_userdata(plugin_unregister_write, arg, "write");
}
static PyObject *cpy_unregister_notification(PyObject *self, PyObject *arg) {
- return cpy_unregister_generic_userdata(plugin_unregister_notification, arg, "notification", 0);
+ return cpy_unregister_generic_userdata(plugin_unregister_notification, arg, "notification");
}
static PyObject *cpy_unregister_flush(PyObject *self, PyObject *arg) {
- return cpy_unregister_generic_userdata(plugin_unregister_flush, arg, "flush", 1);
+ return cpy_unregister_generic_userdata(plugin_unregister_flush, arg, "flush");
}
static PyObject *cpy_unregister_shutdown(PyObject *self, PyObject *arg) {
- return cpy_unregister_generic(&cpy_shutdown_callbacks, arg, "shutdown", 0);
+ return cpy_unregister_generic(&cpy_shutdown_callbacks, arg, "shutdown");
}
static PyMethodDef cpy_methods[] = {