summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Stahl <mstahl@redhat.com>2014-08-28 15:11:37 +0200
committerStephan Bergmann <sbergman@redhat.com>2014-08-28 10:52:57 -0500
commitf919c2c441a88837f3a85b90011ea3d91041f4bb (patch)
tree95c249bdad7742ab2c706870421867d0034a3212
parentb68d4b14c0ff336318602310dd987ced737b4213 (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.cxx18
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 );