diff options
author | Michael Stahl <mstahl@redhat.com> | 2014-08-28 15:11:37 +0200 |
---|---|---|
committer | Stephan Bergmann <sbergman@redhat.com> | 2014-08-28 10:52:57 -0500 |
commit | f919c2c441a88837f3a85b90011ea3d91041f4bb (patch) | |
tree | 95c249bdad7742ab2c706870421867d0034a3212 | |
parent | b68d4b14c0ff336318602310dd987ced737b4213 (diff) |
fdo#46678: pyuno: fix deadlock in Runtime::any2PyObject()
When calling XUnoTunnel::getSomething(), the function must drop the
CPython GIL to avoid deadlock since there are implementations of
XUnoTunnel that acquire SolarMutex.
Change-Id: I51ffce9bdee9a51c932902e77856f865eae81d2a
(cherry picked from commit 0364d3b7e670bddb49d5132268cf28737c3301c6)
Reviewed-on: https://gerrit.libreoffice.org/11178
Reviewed-by: Stephan Bergmann <sbergman@redhat.com>
Tested-by: Stephan Bergmann <sbergman@redhat.com>
-rw-r--r-- | pyuno/source/module/pyuno_runtime.cxx | 18 |
1 files changed, 12 insertions, 6 deletions
diff --git a/pyuno/source/module/pyuno_runtime.cxx b/pyuno/source/module/pyuno_runtime.cxx index 93c60205c54b..e348b2d41088 100644 --- a/pyuno/source/module/pyuno_runtime.cxx +++ b/pyuno/source/module/pyuno_runtime.cxx @@ -562,13 +562,19 @@ PyRef Runtime::any2PyObject (const Any &a ) const } case typelib_TypeClass_INTERFACE: { - Reference< XUnoTunnel > tunnel; - a >>= tunnel; - if( tunnel.is() ) + // fdo#46678 must unlock GIL because getSomething could acquire locks, + // and queryInterface too... { - sal_Int64 that = tunnel->getSomething( ::pyuno::Adapter::getUnoTunnelImplementationId() ); - if( that ) - return ((Adapter*)sal::static_int_cast< sal_IntPtr >(that))->getWrappedObject(); + PyThreadDetach d; + + Reference<XUnoTunnel> tunnel; + a >>= tunnel; + if (tunnel.is()) + { + sal_Int64 that = tunnel->getSomething( ::pyuno::Adapter::getUnoTunnelImplementationId() ); + if( that ) + return ((Adapter*)sal::static_int_cast< sal_IntPtr >(that))->getWrappedObject(); + } } //This is just like the struct case: return PyRef( PyUNO_new (a, getImpl()->cargo->xInvocation), SAL_NO_ACQUIRE ); |