[pypy-commit] pypy ffi-backend: Add support for local/global dlopens

arigo noreply at buildbot.pypy.org
Thu Jul 26 12:15:01 CEST 2012


Author: Armin Rigo <arigo at tunes.org>
Branch: ffi-backend
Changeset: r56466:f3c8da2815e5
Date: 2012-07-26 12:14 +0200
http://bitbucket.org/pypy/pypy/changeset/f3c8da2815e5/

Log:	Add support for local/global dlopens

diff --git a/pypy/module/_cffi_backend/libraryobj.py b/pypy/module/_cffi_backend/libraryobj.py
--- a/pypy/module/_cffi_backend/libraryobj.py
+++ b/pypy/module/_cffi_backend/libraryobj.py
@@ -5,6 +5,7 @@
 from pypy.interpreter.typedef import TypeDef
 from pypy.rpython.lltypesystem import lltype, rffi
 from pypy.rlib.rdynload import DLLHANDLE, dlopen, dlsym, dlclose, DLOpenError
+from pypy.rlib.rdynload import RTLD_GLOBAL
 
 from pypy.module._cffi_backend.cdataobj import W_CData
 from pypy.module._cffi_backend.ctypeobj import W_CType
@@ -14,11 +15,15 @@
 class W_Library(Wrappable):
     handle = rffi.cast(DLLHANDLE, 0)
 
-    def __init__(self, space, filename):
+    def __init__(self, space, filename, is_global):
         self.space = space
+        if is_global and RTLD_GLOBAL is not None:
+            mode = RTLD_GLOBAL
+        else:
+            mode = -1     # default value, corresponds to RTLD_LOCAL
         with rffi.scoped_str2charp(filename) as ll_libname:
             try:
-                self.handle = dlopen(ll_libname)
+                self.handle = dlopen(ll_libname, mode)
             except DLOpenError, e:
                 raise operationerrfmt(space.w_OSError,
                                       "cannot load '%s': %s",
@@ -77,7 +82,7 @@
 W_Library.acceptable_as_base_class = False
 
 
- at unwrap_spec(filename=str)
-def load_library(space, filename):
-    lib = W_Library(space, filename)
+ at unwrap_spec(filename=str, is_global=int)
+def load_library(space, filename, is_global=0):
+    lib = W_Library(space, filename, is_global)
     return space.wrap(lib)
diff --git a/pypy/rlib/rdynload.py b/pypy/rlib/rdynload.py
--- a/pypy/rlib/rdynload.py
+++ b/pypy/rlib/rdynload.py
@@ -114,6 +114,7 @@
 
 if _WIN32:
     DLLHANDLE = rwin32.HMODULE
+    RTLD_GLOBAL = None
 
     def dlopen(name, mode=-1):
         # mode is unused on windows, but a consistant signature


More information about the pypy-commit mailing list