Hi all,
I've been working on investigating a couple of crashes that occur with
wxPython 3.0.2.0 with a GTK+3 backend:
http://trac.wxwidgets.org/ticket/16820
There is a similar crash that occurs when using a wx.Printer.
Anyway, I've spent considerable time investigating these and found that
the crash is because GTK performs some dlsym() calls to lookup symbol
names and fails in going so because its symbols were loaded in the local
namespace, not the global namespace (ie, RTLD_LOCAL vs RTLD_GLOBAL).
I've discussed this with the GTK devs and basically, GTK expects its
symbols to be loaded globally.
Thus, I have a solution that I would like to propose for discussion:
diff -up wxPython/src/__init__.py.dlopenflags wxPython/src/__init__.py
--- wxPython/src/__init__.py.dlopenflags 2013-02-27
15:14:01.000000000 -0500
+++ wxPython/src/__init__.py 2015-02-24 20:43:44.143492336 -0500
@@ -42,7 +42,11 @@ __all__ = [
]
# Load the package namespace with the core classes and such
+import dl, sys
+flags = sys.getdlopenflags()
+sys.setdlopenflags(flags|dl.RTLD_GLOBAL)
from wx._core import *
+sys.setdlopenflags(flags)
del wx
if 'wxMSW' in PlatformInfo:
===
Basically, this would change the dlopen flags before importing the core
module to RTLD_GLOBAL and then change them back afterwards. That way, the
core module and its dependencies (to include GTK) are loaded into the
global namespace.
Comments on this proposal?
It needs more work but I wanted to get feedback before finalizing a patch.
(ie, it probably only needs to be done on when we're using a GTK+3
backend, needs to check whether the dl module is available, etc.)
Thanks,
Scott