X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=python-plugin-provider%2Fpython-plugin-provider.c;h=f4747ef7e6972769abae94c6341ba4d4a3a1c8ae;hb=d841f73357d2738ff2b283a5f677ac76a49b0ed7;hp=c276aadff3bd31989e19bc0873faba6624a051a4;hpb=7f8b9578155e3a870d7e6e7520313a45392151c6;p=babeltrace.git diff --git a/python-plugin-provider/python-plugin-provider.c b/python-plugin-provider/python-plugin-provider.c index c276aadf..f4747ef7 100644 --- a/python-plugin-provider/python-plugin-provider.c +++ b/python-plugin-provider/python-plugin-provider.c @@ -24,20 +24,12 @@ * SOFTWARE. */ -#define BT_LOG_OUTPUT_LEVEL python_plugin_provider_log_level #define BT_LOG_TAG "PLUGIN-PY" -#include - -/* - * Must be before the rest because some of the headers below could - * contain logging statements which need this symbol when expanded. - */ -static int python_plugin_provider_log_level = BT_LOG_NONE; +#include "logging.h" #include #include -#include -#include +#include #include #include #include @@ -64,13 +56,7 @@ enum python_state { } python_state = PYTHON_STATE_NOT_INITED; static PyObject *py_try_load_plugin_module_func = NULL; - -static -void __attribute__((constructor)) logging_ctor(void) -{ - python_plugin_provider_log_level = - bt_log_get_level_from_env("BABELTRACE_PYTHON_PLUGIN_PROVIDER_LOG_LEVEL"); -} +static bool python_was_initialized_by_us; static void print_python_traceback_warn(void) @@ -94,7 +80,9 @@ void init_python(void) { PyObject *py_bt2_py_plugin_mod = NULL; const char *dis_python_env; +#ifndef __MINGW32__ sighandler_t old_sigint = signal(SIGINT, SIG_DFL); +#endif if (python_state != PYTHON_STATE_NOT_INITED) { goto end; @@ -113,9 +101,14 @@ void init_python(void) } if (!Py_IsInitialized()) { + BT_LOGI_STR("Python interpreter is not initialized: initializing Python interpreter."); Py_InitializeEx(0); + python_was_initialized_by_us = true; BT_LOGI("Initialized Python interpreter: version=\"%s\"", Py_GetVersion()); + } else { + BT_LOGI("Python interpreter is already initialized: version=\"%s\"", + Py_GetVersion()); } py_bt2_py_plugin_mod = PyImport_ImportModule("bt2.py_plugin"); @@ -136,9 +129,11 @@ void init_python(void) python_state = PYTHON_STATE_FULLY_INITIALIZED; end: +#ifndef __MINGW32__ if (old_sigint != SIG_ERR) { (void) signal(SIGINT, old_sigint); } +#endif print_python_traceback_warn(); pyerr_clear(); @@ -148,7 +143,7 @@ end: __attribute__((destructor)) static void fini_python(void) { - if (Py_IsInitialized()) { + if (Py_IsInitialized() && python_was_initialized_by_us) { if (py_try_load_plugin_module_func) { Py_DECREF(py_try_load_plugin_module_func); py_try_load_plugin_module_func = NULL; @@ -162,9 +157,9 @@ void fini_python(void) { } static -struct bt_plugin *bt_plugin_from_python_plugin_info(PyObject *plugin_info) +const bt_plugin *bt_plugin_from_python_plugin_info(PyObject *plugin_info) { - struct bt_plugin *plugin = NULL; + const bt_plugin *plugin = NULL; PyObject *py_name = NULL; PyObject *py_author = NULL; PyObject *py_description = NULL; @@ -179,8 +174,8 @@ struct bt_plugin *bt_plugin_from_python_plugin_info(PyObject *plugin_info) const char *version_extra = NULL; int ret; - assert(plugin_info); - assert(python_state == PYTHON_STATE_FULLY_INITIALIZED); + BT_ASSERT(plugin_info); + BT_ASSERT(python_state == PYTHON_STATE_FULLY_INITIALIZED); py_name = PyObject_GetAttrString(plugin_info, "name"); if (!py_name) { BT_LOGW("Cannot find `name` attribute in Python plugin info object: " @@ -271,9 +266,9 @@ struct bt_plugin *bt_plugin_from_python_plugin_info(PyObject *plugin_info) PyObject *py_minor = PyTuple_GetItem(py_version, 1); PyObject *py_patch = PyTuple_GetItem(py_version, 2); - assert(py_major); - assert(py_minor); - assert(py_patch); + BT_ASSERT(py_major); + BT_ASSERT(py_minor); + BT_ASSERT(py_patch); if (PyLong_Check(py_major)) { major = PyLong_AsUnsignedLong(py_major); @@ -298,7 +293,7 @@ struct bt_plugin *bt_plugin_from_python_plugin_info(PyObject *plugin_info) if (PyTuple_Size(py_version) >= 4) { PyObject *py_extra = PyTuple_GetItem(py_version, 3); - assert(py_extra); + BT_ASSERT(py_extra); if (PyUnicode_Check(py_extra)) { version_extra = PyUnicode_AsUTF8(py_extra); @@ -337,14 +332,14 @@ struct bt_plugin *bt_plugin_from_python_plugin_info(PyObject *plugin_info) size_t i; for (i = 0; i < PyList_Size(py_comp_class_addrs); i++) { - struct bt_component_class *comp_class; + bt_component_class *comp_class; PyObject *py_comp_class_addr; py_comp_class_addr = PyList_GetItem(py_comp_class_addrs, i); - assert(py_comp_class_addr); + BT_ASSERT(py_comp_class_addr); if (PyLong_Check(py_comp_class_addr)) { - comp_class = (struct bt_component_class *) + comp_class = (bt_component_class *) PyLong_AsUnsignedLongLong(py_comp_class_addr); } else { BT_LOGW("Component class address is not an integer in Python plugin info object: " @@ -379,7 +374,7 @@ struct bt_plugin *bt_plugin_from_python_plugin_info(PyObject *plugin_info) error: print_python_traceback_warn(); pyerr_clear(); - BT_PUT(plugin); + BT_OBJECT_PUT_REF_AND_RESET(plugin); end: Py_XDECREF(py_name); @@ -392,15 +387,15 @@ end: } G_MODULE_EXPORT -struct bt_plugin_set *bt_plugin_python_create_all_from_file(const char *path) +bt_plugin_set *bt_plugin_python_create_all_from_file(const char *path) { - struct bt_plugin_set *plugin_set = NULL; - struct bt_plugin *plugin = NULL; + bt_plugin_set *plugin_set = NULL; + const bt_plugin *plugin = NULL; PyObject *py_plugin_info = NULL; gchar *basename = NULL; size_t path_len; - assert(path); + BT_ASSERT(path); if (python_state == PYTHON_STATE_CANNOT_INITIALIZE) { /* @@ -496,10 +491,10 @@ struct bt_plugin_set *bt_plugin_python_create_all_from_file(const char *path) goto end; error: - BT_PUT(plugin_set); + BT_OBJECT_PUT_REF_AND_RESET(plugin_set); end: - bt_put(plugin); + bt_plugin_put_ref(plugin); Py_XDECREF(py_plugin_info); g_free(basename); return plugin_set;