diff options
-rw-r--r-- | configure.ac | 18 | ||||
-rw-r--r-- | tests/env.rc.in | 5 | ||||
-rwxr-xr-x | tests/features/glupy.t | 1 | ||||
-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 |
6 files changed, 45 insertions, 26 deletions
diff --git a/configure.ac b/configure.ac index 3757c33df72..4de524f8bda 100644 --- a/configure.ac +++ b/configure.ac @@ -219,6 +219,7 @@ AC_CANONICAL_HOST AC_PROG_CC AC_DISABLE_STATIC AC_PROG_LIBTOOL +AC_SUBST([shrext_cmds]) AC_CHECK_PROG([RPCGEN], [rpcgen], [yes], [no]) @@ -1003,18 +1004,9 @@ saved_CFLAGS=$CFLAGS saved_CPPFLAGS=$CPPFLAGS saved_LDFLAGS=$LDFLAGS -case $host_os in - linux*) - CFLAGS="`${PYTHON}-config --cflags`" - CPPFLAGS=$CFLAGS - LDFLAGS="-L`${PYTHON}-config --prefix`/lib `${PYTHON}-config --ldflags`" - ;; - darwin*) - CFLAGS="`${PYTHON}-config --cflags`" - CPPFLAGS=$CFLAGS - LDFLAGS="-L`${PYTHON}-config --prefix`/lib `${PYTHON}-config --ldflags`" - ;; -esac +CFLAGS="`${PYTHON}-config --cflags`" +CPPFLAGS=$CFLAGS +LDFLAGS="-L`${PYTHON}-config --prefix`/lib `${PYTHON}-config --ldflags`" AC_CHECK_HEADERS([python$PYTHON_VERSION/Python.h],[have_Python_h=yes],[]) AC_ARG_ENABLE([glupy], @@ -1065,12 +1057,14 @@ case $host_os in esac if test "x$BUILD_GLUPY" = "xyes"; then + BUILD_PYTHON_SITE_PACKAGES=`$PYTHON -c 'from distutils.sysconfig import get_python_lib; print(get_python_lib())'` BUILD_PYTHON_INC=`$PYTHON -c "from distutils import sysconfig; print sysconfig.get_python_inc()"` BUILD_PYTHON_LIB=python$PYTHON_VERSION GLUPY_SUBDIR=glupy GLUPY_SUBDIR_MAKEFILE=xlators/features/glupy/Makefile GLUPY_SUBDIR_SRC_MAKEFILE=xlators/features/glupy/src/Makefile echo "building glupy with -isystem $BUILD_PYTHON_INC -l $BUILD_PYTHON_LIB" + AC_SUBST(BUILD_PYTHON_SITE_PACKAGES) AC_SUBST(BUILD_PYTHON_INC) AC_SUBST(BUILD_PYTHON_LIB) AC_SUBST(GLUPY_SUBDIR) diff --git a/tests/env.rc.in b/tests/env.rc.in index 000a80f18fb..1850b7a36f6 100644 --- a/tests/env.rc.in +++ b/tests/env.rc.in @@ -8,4 +8,7 @@ LD_LIBRARY_PATH=@libdir@:$LD_LIBRARY_PATH export LD_LIBRARY_PATH GLUSTERD_WORKDIR=@GLUSTERD_WORKDIR@ -export GLUSTERD_WORKDIR
\ No newline at end of file +export GLUSTERD_WORKDIR + +PYTHONPATH=@BUILD_PYTHON_SITE_PACKAGES@:$PYTHON_PATH +export PYTHONPATH diff --git a/tests/features/glupy.t b/tests/features/glupy.t index a34e48ffec0..8b79a148d4d 100755 --- a/tests/features/glupy.t +++ b/tests/features/glupy.t @@ -3,6 +3,7 @@ . $(dirname $0)/../include.rc . $(dirname $0)/../volume.rc +echo $PYTHON_PATH >&2 cleanup; TEST mkdir -p $B0/glupytest 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): |