On Tue, Aug 10, 2010 at 11:15:41PM +0200, Bram Moolenaar wrote:
> A configure check would help to decide whether everything works without
> RTLD_GLOBAL global.  If it does, then the current solution is best.  If
> it doesn't it might be better to switch to the other solution: do use
> RTLD_GLOBAL but disallow using both python commands.

Attached is a configure check that determines if RTLD_GLOBAL is needed,
when building with dynamic python.  If so, it enables the "only one
Python interface can be used per session" code.

-- 
James
GPG Key: 1024D/61326D40 2003-09-02 James Vega <james...@jamessan.com>
diff --git a/src/config.h.in b/src/config.h.in
--- a/src/config.h.in
+++ b/src/config.h.in
@@ -343,6 +343,9 @@
 /* Define for linking via dlopen() or LoadLibrary() */
 #undef DYNAMIC_PYTHON3
 
+/* Define if dynamic python requires RTLD_GLOBAL */
+#undef PY_RTLD_GLOBAL
+
 /* Define if you want to include the Ruby interpreter. */
 #undef FEAT_RUBY
 
diff --git a/src/configure.in b/src/configure.in
--- a/src/configure.in
+++ b/src/configure.in
@@ -1109,6 +1109,31 @@
 if test "$python_ok" = yes && test "$python3_ok" = yes; then
   AC_DEFINE(DYNAMIC_PYTHON)
   AC_DEFINE(DYNAMIC_PYTHON3)
+  AC_MSG_CHECKING(whether dynamic python requires RTLD_GLOBAL)
+  cflags_save=$CFLAGS
+  CFLAGS="$CFLAGS $PYTHON3_CFLAGS"
+  AC_RUN_IFELSE([
+  #include <Python.h>
+  #include <dlfcn.h>
+
+  int main(int argc, char** argv)
+  {
+      int needed = 0;
+      void* pylib = dlopen("${python3_INSTSONAME}", RTLD_LAZY);
+      if (pylib != NULL)
+      {
+          void (*init)(void) = dlsym(pylib, "Py_Initialize");
+          int (*simple)(char*) = dlsym(pylib, "PyRun_SimpleString");
+          void (*final)(void) = dlsym(pylib, "Py_Finalize");
+          (*init)();
+          needed = (*simple)("import termios") == -1;
+          (*final)();
+          dlclose(pylib);
+      }
+      return needed;
+  }],
+  [AC_MSG_RESULT(no)], [AC_MSG_RESULT(yes); AC_DEFINE(PY_RTLD_GLOBAL)])
+  CFLAGS=$cflags_save
   PYTHON_SRC="if_python.c"
   PYTHON_OBJ="objects/if_python.o"
   PYTHON_CFLAGS="$PYTHON_CFLAGS -DDYNAMIC_PYTHON_DLL=\\\"${python_INSTSONAME}\\\""
diff --git a/src/if_python.c b/src/if_python.c
--- a/src/if_python.c
+++ b/src/if_python.c
@@ -102,9 +102,7 @@
 #  include <dlfcn.h>
 #  define FARPROC void*
 #  define HINSTANCE void*
-#  ifdef FEAT_PYTHON3
-   /* Don't use RTLD_GLOBAL, it may cause a crash if both :python and :py3 are
-    * used. But without it importing may fail, e.g., for termios. */
+#  ifndef PY_RTLD_GLOBAL
 #   define load_dll(n) dlopen((n), RTLD_LAZY)
 #  else
 #   define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
@@ -351,7 +349,7 @@
 {
     int i;
 
-#if 0  /* this should be OK now that we don't use RTLD_GLOBAL */
+#ifdef PY_RTLD_GLOBAL
 #if defined(UNIX) && defined(FEAT_PYTHON3)
     /* Can't have Python and Python3 loaded at the same time, it may cause a
      * crash. */
diff --git a/src/if_python3.c b/src/if_python3.c
--- a/src/if_python3.c
+++ b/src/if_python3.c
@@ -80,9 +80,7 @@
 #  include <dlfcn.h>
 #  define FARPROC void*
 #  define HINSTANCE void*
-#  ifdef FEAT_PYTHON
-   /* Don't use RTLD_GLOBAL, it may cause a crash if both :python and :py3 are
-    * used. But without it importing may fail, e.g., for termios. */
+#  ifndef PY_RTLD_GLOBAL
 #   define load_dll(n) dlopen((n), RTLD_LAZY)
 #  else
 #   define load_dll(n) dlopen((n), RTLD_LAZY|RTLD_GLOBAL)
@@ -338,7 +336,7 @@
     int i;
     void *ucs_from_string, *ucs_from_string_and_size;
 
-# if 0  /* this should be OK now that we don't use RTLD_GLOBAL */
+# ifdef PY_RTLD_GLOBAL
 # if defined(UNIX) && defined(FEAT_PYTHON)
     /* Can't have Python and Python3 loaded at the same time, it may cause a
      * crash. */

Attachment: signature.asc
Description: Digital signature

Raspunde prin e-mail lui