Apparently the thread spawned in decreaseRefCount runs and deletes
itself before the "m_hThread != 0" from osl::Thread::create is executed;
try a lame workaround for that.
==1877== Invalid read of size 8
==1877== at 0x2A70E546: osl::Thread::create() (in pyuno/unxlngx6/lib/libpyuno.so)
==1877== by 0x2A70E351: pyuno::decreaseRefCount(_is*, _object*) (in pyuno/unxlngx6/lib/libpyuno.so)
==1877== by 0x2A7092B4: pyuno::Adapter::~Adapter() (in pyuno/unxlngx6/lib/libpyuno.so)
==1877== by 0x2A709393: pyuno::Adapter::~Adapter() (in pyuno/unxlngx6/lib/libpyuno.so)
==1877== by 0x5EF2F64: cppu::OWeakObject::release() (weak.cxx:213)
==1877== by 0x2A70DE69:
==1877== Address 0x1ee30818 is 8 bytes inside a block of size 32 free'd
==1877== at 0x4A0662E: free (vg_replace_malloc.c:366)
==1877== by 0x4C44B62: rtl_freeMemory_SYSTEM(void*) (alloc_global.cxx:285)
==1877== by 0x4C44DC7: rtl_freeMemory (alloc_global.cxx:355)
==1877== by 0x2A70E41E: osl::Thread::operator delete(void*) (in pyuno/unxlngx6/lib/libpyuno.so)
==1877== by 0x2A70E6EF: pyuno::GCThread::~GCThread() (in pyuno/unxlngx6/lib/libpyuno.so)
==1877== by 0x2A70E303: pyuno::GCThread::onTerminated() (in pyuno/unxlngx6/lib/libpyuno.so)
==1877== by 0x2A70E671: threadFunc (in pyuno/unxlngx6/lib/libpyuno.so)
==1877== by 0x4C2E242: osl_thread_start_Impl (thread.c:292)
==1877== by 0x3C26607D8F: start_thread (pthread_create.c:309)
==1877== by 0x3C262EF48C: clone (clone.S:115)
...it was cleaned away by a09ce46818 "Port PyUno
to support Python 3" but is still needed to make sure libpyuno.so is loaded
RTLD_GLOBAL (Python apparently loads its modules RTLD_LOCAL). At least with
pre 4.5 GCC this can cause problems with C++ exception handling, see the mail
thread starting at
<http://lists.freedesktop.org/archives/libreoffice/2012-February/025166.html>
"LibO 3.5RC2: terminate called after throwing an instance of
'com::sun:⭐:registry::InvalidRegistryException'" for details.
SAL_UNUSED_PARAMETER (expanding to __attribute__ ((unused)) for GCC)
is used to annotate legitimately unused parameters, so that static
analysis tools can tell legitimately unused parameters from truly
unnecessary ones. To that end, some patches for external modules
are also added, that are only applied when compiling with GCC and
add necessary __attribute__ ((unused)) in headers.
This commit for the old build system. (Don't bother for components not
relevant for Android.)
The Android package installer (as invoked through "adb install", from
"ant debug install") silently ignores native libraries in app packages
(.apk files) whose names don't start with "lib" and end with ".so".
The package builder (as invoked through "ant debug") in the SDK gladly
includes also thusly named native libraries in the .apk, though. Yay
for consistency.
Whether things actually work when pyuno is built against the debugging
runtime, but the internal Python (to the best of my knowledge) still
against the normal one, I don't know. But anyway, this makes the build
succeed here.
This allows having a meaningful error message when extractUnoException
is called from pyuno_loader::getLoaderModule() (via
raiseRuntimeExceptionWhenNeeded()). If it is called to treat an error
that cropped up in loading uno.py, the old code would abort the whole
operation by throwing an exception because... it gets essentially the
same error. The new code leads to a sensible message on the Python
debug console.
This avoids breaking the whole python process module importing
when an uno.py import failure happens after the hooking point.
In that case, _uno_import is still the python module loader,
but _g_delegatee is not anymore bound to the previously installed
importer, and thus any module import fails with:
File "/home/master/src/libreoffice/core/install/basis3.5/program/uno.py", line 260, in _uno_import
return _g_delegatee( name, *optargs, **kwargs )
TypeError: 'NoneType' object is not callable