diff options
Diffstat (limited to 'xlators')
-rw-r--r-- | xlators/features/glupy/src/Makefile.am | 4 | ||||
-rw-r--r-- | xlators/features/glupy/src/glupy.c | 40 | ||||
-rw-r--r-- | xlators/features/glupy/src/glupy.py | 3 |
3 files changed, 34 insertions, 13 deletions
diff --git a/xlators/features/glupy/src/Makefile.am b/xlators/features/glupy/src/Makefile.am index d9361a5ef49..de8b0de9eeb 100644 --- a/xlators/features/glupy/src/Makefile.am +++ b/xlators/features/glupy/src/Makefile.am @@ -4,7 +4,7 @@ xlator_LTLIBRARIES = glupy.la xlatordir = $(libdir)/glusterfs/$(PACKAGE_VERSION)/xlator/features glupydir = $(xlatordir)/glupy AM_CPPFLAGS = $(PYTHONDEV_CPPFLAGS) $(GF_CPPFLAGS) -I$(top_srcdir)/libglusterfs/src -isystem $(BUILD_PYTHON_INC) -AM_CFLAGS = $(PYTHONDEV_CFLAGS) -Wall -fno-strict-aliasing -DGLUSTER_PYTHON_PATH=\"$(glupydir)\" $(GF_CFLAGS) +AM_CFLAGS = $(PYTHONDEV_CFLAGS) -Wall -fno-strict-aliasing -DGLUSTER_PYTHON_PATH=\"$(glupydir)\" -DPATH_GLUSTERFS_GLUPY_MODULE=\"${xlatordir}/glupy${shrext_cmds}\" $(GF_CFLAGS) # Flags to build glupy.so with glupy_la_LDFLAGS = $(PYTHONDEV_LDFLAGS) -module -avoid-version -shared -nostartfiles @@ -15,7 +15,7 @@ glupy_la_LIBADD = $(top_builddir)/libglusterfs/src/libglusterfs.la \ noinst_HEADERS = glupy.h # Install glupy.py into the Python site-packages area -pyglupydir = $(pythondir)/gluster +pyglupydir = @BUILD_PYTHON_SITE_PACKAGES@/gluster pyglupy_PYTHON = glupy.py __init__.py CLEANFILES = diff --git a/xlators/features/glupy/src/glupy.c b/xlators/features/glupy/src/glupy.c index 292f5b7292f..7bb88c0a0ae 100644 --- a/xlators/features/glupy/src/glupy.c +++ b/xlators/features/glupy/src/glupy.c @@ -31,12 +31,10 @@ pthread_key_t gil_init_key; PyGILState_STATE glupy_enter (void) { -#if 0 if (!pthread_getspecific(gil_init_key)) { PyEval_ReleaseLock(); (void)pthread_setspecific(gil_init_key,(void *)1); } -#endif return PyGILState_Ensure(); } @@ -2333,6 +2331,9 @@ init (xlator_t *this) PyObject *py_args = NULL; PyObject *syspath = NULL; PyObject *path = NULL; + PyObject *error_type = NULL; + PyObject *error_msg = NULL; + PyObject *error_bt = NULL; static gf_boolean_t py_inited = _gf_false; void * err_cleanup = &&err_return; @@ -2349,12 +2350,20 @@ init (xlator_t *this) err_cleanup = &&err_free_priv; if (!py_inited) { + /* + * This must be done before Py_Initialize(), + * because it will duplicate the environment, + * and fail to see later environment updates. + */ + setenv("PATH_GLUSTERFS_GLUPY_MODULE", + PATH_GLUSTERFS_GLUPY_MODULE, 1); + Py_Initialize(); PyEval_InitThreads(); -#if 0 + (void)pthread_key_create(&gil_init_key,NULL); (void)pthread_setspecific(gil_init_key,(void *)1); -#endif + /* PyEval_InitThreads takes this "for" us. No thanks. */ PyEval_ReleaseLock(); py_inited = _gf_true; @@ -2370,7 +2379,9 @@ init (xlator_t *this) if (!py_mod_name) { gf_log (this->name, GF_LOG_ERROR, "could not create name"); if (PyErr_Occurred()) { - PyErr_Print(); + PyErr_Fetch (&error_type, &error_msg, &error_bt); + gf_log (this->name, GF_LOG_ERROR, "Python error: %s", + PyString_AsString(error_msg)); } goto *err_cleanup; } @@ -2379,9 +2390,12 @@ init (xlator_t *this) priv->py_module = PyImport_Import(py_mod_name); Py_DECREF(py_mod_name); if (!priv->py_module) { - gf_log (this->name, GF_LOG_ERROR, "Python import failed"); + gf_log (this->name, GF_LOG_ERROR, "Python import of %s failed", + module_name); if (PyErr_Occurred()) { - PyErr_Print(); + PyErr_Fetch (&error_type, &error_msg, &error_bt); + gf_log (this->name, GF_LOG_ERROR, "Python error: %s", + PyString_AsString(error_msg)); } goto *err_cleanup; } @@ -2392,7 +2406,9 @@ init (xlator_t *this) if (!py_init_func || !PyCallable_Check(py_init_func)) { gf_log (this->name, GF_LOG_ERROR, "missing init func"); if (PyErr_Occurred()) { - PyErr_Print(); + PyErr_Fetch (&error_type, &error_msg, &error_bt); + gf_log (this->name, GF_LOG_ERROR, "Python error: %s", + PyString_AsString(error_msg)); } goto *err_cleanup; } @@ -2402,7 +2418,9 @@ init (xlator_t *this) if (!py_args) { gf_log (this->name, GF_LOG_ERROR, "could not create args"); if (PyErr_Occurred()) { - PyErr_Print(); + PyErr_Fetch (&error_type, &error_msg, &error_bt); + gf_log (this->name, GF_LOG_ERROR, "Python error: %s", + PyString_AsString(error_msg)); } goto *err_cleanup; } @@ -2414,7 +2432,9 @@ init (xlator_t *this) if (!priv->py_xlator) { gf_log (this->name, GF_LOG_ERROR, "Python init failed"); if (PyErr_Occurred()) { - PyErr_Print(); + PyErr_Fetch (&error_type, &error_msg, &error_bt); + gf_log (this->name, GF_LOG_ERROR, "Python error: %s", + PyString_AsString(error_msg)); } goto *err_cleanup; } diff --git a/xlators/features/glupy/src/glupy.py b/xlators/features/glupy/src/glupy.py index eda8aebb0bb..b9fc3700fa6 100644 --- a/xlators/features/glupy/src/glupy.py +++ b/xlators/features/glupy/src/glupy.py @@ -9,9 +9,10 @@ ## import sys +import os from ctypes import * -dl = CDLL("",RTLD_GLOBAL) +dl = CDLL(os.getenv("PATH_GLUSTERFS_GLUPY_MODULE", ""),RTLD_GLOBAL) class call_frame_t (Structure): |