Date: prev next · Thread: first prev next last
2015 Archives by date, by thread · List index


It now probably becomes a question for Stephan. See below.

On Tue, Jun 02, 2015 at 03:17:16PM +0200, Lionel Elie Mamane wrote:
On Tue, Jun 02, 2015 at 03:12:51PM +0200, Noel Grandin wrote:

I would suggest something like this in ODriverDelegator::flushConnections():

    take_mutex();
    std::vector<Connection> tmp = m_aConnections;
    release_mutex();
    for (Connection conn : tmp)
        conn.flush();

so that the mutex is not held during the problematic phase

That makes sense. Will try that. Thanks!

It does not solve my problem, because the same mutex is taken deeper
in the stack:


#23 0x00002abc1b1a9fd8 in connectivity::hsqldb::ODriverDelegator::preCommit (this=0x2d24ef0, 
aEvent=...)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/connectivity/source/drivers/hsqldb/HDriver.cxx:65
#24 0x00002abc18bb7081 in OStorage::BroadcastTransaction (this=this@entry=0x3578030, 
    nMessage=nMessage@entry=1 '\001')
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/package/source/xstor/xstorage.cxx:2094
#25 0x00002abc18bc66e3 in OStorage::commit (this=0x3578030)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/package/source/xstor/xstorage.cxx:3937
#26 0x00002abc13f336ad in dbaccess::tools::stor::commitStorageIfWriteable (
    _rxStorage=uno::Reference to (OStorage *) 0x3578038)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/dbaccess/source/core/misc/sdbcoretools.cxx:139
#27 0x00002abc13ef82cd in dbaccess::DocumentStorageAccess::commitEmbeddedStorage (this=0x35ba790, 
    _bPreventRootCommits=_bPreventRootCommits@entry=false)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/dbaccess/source/core/dataaccess/ModelImpl.cxx:290
#28 0x00002abc13efc0b2 in dbaccess::ODatabaseModelImpl::commitEmbeddedStorage (this=0x35bbd20, 
    _bPreventRootCommits=_bPreventRootCommits@entry=false)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/dbaccess/source/core/dataaccess/ModelImpl.cxx:887
#29 0x00002abc13eb58c8 in dbaccess::ODatabaseSource::flushed (this=0x35b7c60)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/dbaccess/source/core/dataaccess/datasource.cxx:1306
#30 0x00002abc13eae005 in dbaccess::FlushNotificationAdapter::flushed (this=0x318ec50, rEvent=...)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/dbaccess/source/core/dataaccess/datasource.cxx:172
(...)
#34 0x00002abc1b1a07f1 in connectivity::hsqldb::OHsqlConnection::flush (this=0x3577db0)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/connectivity/source/drivers/hsqldb/HConnection.cxx:168
#35 0x00002abc1b1a9ba3 in connectivity::hsqldb::ODriverDelegator::flushConnections (this=0x2d24ef0)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/connectivity/source/drivers/hsqldb/HDriver.cxx:629


But let's take it from the other side...

connectivity::hsqldb::ODriverDelegator::preCommit does:


654     Reference<XConnection> xConnection(i->first,UNO_QUERY);
655     if ( xConnection.is() )
656     {
657           Reference< XStatement> xStmt = xConnection->createStatement();

Now, this goes through a whole rigmarole:

#6  0x00002abc1b6e90d3 in AffineBridge::v_callInto_v (this=0x2d29b50, pCallee=0x2abbf94eedbe 
<s_pull(va_list*)>, 
    pParam=0x2abc0fd9bdb0)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/cppu/source/AffineBridge/AffineBridge.cxx:250
#7  0x00002abc1b6e9b07 in cppu::Enterable_call_callInto_v (context=0x2d29b50, 
    pCallee=0x2abbf94eedbe <s_pull(va_list*)>, pParam=0x2abc0fd9bdb0)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/include/cppu/Enterable.hxx:69
#8  0x00002abc1b8eee97 in cppu::Enterable::callInto_v (this=0x2d29b50, 
    pCallee=pCallee@entry=0x2abbf94eedbe <s_pull(va_list*)>, pParam=pParam@entry=0x2abc0fd9bdb0)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/include/cppu/Enterable.hxx:53
#9  0x00002abc1b8eeccf in Base::v_callInto_v (this=0x2d29eb0, pCallee=0x2abbf94eedbe 
<s_pull(va_list*)>, 
    pParam=0x2abc0fd9bdb0)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/cppu/source/helper/purpenv/helper_purpenv_Environment.cxx:508
#10 0x00002abc1b8eef6f in cppu::Enterable_call_callInto_v (context=0x2d29eb0, 
    pCallee=0x2abbf94eedbe <s_pull(va_list*)>, pParam=0x2abc0fd9bdb0)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/include/cppu/Enterable.hxx:69
#11 0x00002abbf94ef997 in cppu::Enterable::callInto_v (this=this@entry=0x2d29eb0, 
    pCallee=pCallee@entry=0x2abbf94eedbe <s_pull(va_list*)>, pParam=pParam@entry=0x2abc0fd9bdb0)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/include/cppu/Enterable.hxx:53
#12 0x00002abbf94efaac in cppu::Enterable::callInto (this=this@entry=0x2d29eb0, 
    pCallee=pCallee@entry=0x2abbf94eedbe <s_pull(va_list*)>)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/include/cppu/Enterable.hxx:90
#13 0x00002abbf94eeeb4 in s_callInto_v (pEnv=pEnv@entry=0x2d29900, 
    pCallee=pCallee@entry=0x2abbf94ef0b9 <s_environment_invoke_vv(va_list*)>, 
pParam=pParam@entry=0x2abc0fd9bee0)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/cppu/source/uno/EnvStack.cxx:233
#14 0x00002abbf94eef7e in s_callInto (pEnv=0x2d29900, 
    pCallee=pCallee@entry=0x2abbf94ef0b9 <s_environment_invoke_vv(va_list*)>)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/cppu/source/uno/EnvStack.cxx:244
#15 0x00002abbf94ef316 in s_environment_invoke_v (pCurrEnv=0x0, 
pTargetEnv=pTargetEnv@entry=0x2d29900, 
    pCallee=pCallee@entry=0x2abc1b8f07c6 <s_dispatcher_v(va_list*)>, 
pParam=pParam@entry=0x2abc0fd9c050)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/cppu/source/uno/EnvStack.cxx:300
#16 0x00002abbf94ef384 in uno_Environment_invoke_v (pTargetEnv=pTargetEnv@entry=0x2d29900, 
    pCallee=pCallee@entry=0x2abc1b8f07c6 <s_dispatcher_v(va_list*)>, 
pParam=pParam@entry=0x2abc0fd9c050)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/cppu/source/uno/EnvStack.cxx:312
#17 0x00002abbf94ef456 in uno_Environment_invoke (pEnv=0x2d29900, 
    pCallee=0x2abc1b8f07c6 <s_dispatcher_v(va_list*)>)
    at /home/master/src/libreoffice/workdirs/libreoffice-5-1/cppu/source/uno/EnvStack.cxx:321
#18 0x00002abc1b8f0ccc in Proxy::dispatch (this=this@entry=0x3577660, 
    pReturnTypeRef=pReturnTypeRef@entry=0x3023920, pParams=pParams@entry=0x0, 
nParams=nParams@entry=0, 
    pMemberType=pMemberType@entry=0x3436a40, pReturn=pReturn@entry=0x2abc0fd9c2f0, 
pArgs=0x2abc0fd9c2e0, 
    ppException=0x2abc0fd9c390)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/cppu/source/helper/purpenv/helper_purpenv_Proxy.cxx:445
#19 0x00002abc1b8efc7d in s_Proxy_dispatch (pUnoI=0x3577660, 
pMemberType=pMemberType@entry=0x3436a40, 
    pReturn=pReturn@entry=0x2abc0fd9c2f0, pArgs=pArgs@entry=0x2abc0fd9c2e0, 
    ppException=ppException@entry=0x2abc0fd9c390)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/cppu/source/helper/purpenv/helper_purpenv_Proxy.cxx:170
#20 0x00002abc0f3f1fd2 in cpp2uno_call (pThis=pThis@entry=0x2d2ca80, pMemberTypeDescr=0x3436a40, 
    pReturnTypeRef=pReturnTypeRef@entry=0x3023920, nParams=nParams@entry=0, 
pParams=pParams@entry=0x0, 
    gpreg=0x2abc0fd9c720, gpreg@entry=0x2abc0fd9c710, fpreg=0x2abc0fd9c740, ovrflw=0x2abc0fd9c790, 
    pRegisterReturn=0x2abc0fd9c6f0)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/bridges/source/cpp_uno/gcc3_linux_x86-64/cpp2uno.cxx:186
#21 0x00002abc0f3f2a6a in cpp_vtable_call (nFunctionIndex=<optimized out>, nVtableOffset=0, 
    gpreg=0x2abc0fd9c710, fpreg=0x2abc0fd9c740, ovrflw=0x2abc0fd9c790, 
pRegisterReturn=0x2abc0fd9c6f0)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/bridges/source/cpp_uno/gcc3_linux_x86-64/cpp2uno.cxx:377
#22 0x00002abc0f409c12 in privateSnippetExecutor ()
   from /home/master/src/libreoffice/workdirs/libreoffice-5-1/instdir/program/libgcc3_uno.so
#23 0x00002abc1b1a9fd8 in connectivity::hsqldb::ODriverDelegator::preCommit (this=0x2d24ef0, 
aEvent=...)
    at 
/home/master/src/libreoffice/workdirs/libreoffice-5-1/connectivity/source/drivers/hsqldb/HDriver.cxx:657
#24 0x00002abc18bb7081 in OStorage::BroadcastTransaction (this=this@entry=0x3578030, 

The problem is essentially the serializing that happens at
AffineBridge::v_callInto_v.

Now, I guess that the whole privateSnippetExecutor / cpp_vtable_call /
cpp2uno_call / s_Proxy_dispatch / ... / AffineBridge::v_callInto_v for
a C++-to-C++ call is somehow linked to the fact that the calling code
does not know the object that implements the XConnection
interface. Can I avoid it in some way? For example, I *know* that
m_xConnection is a connectivity::java_sql_connection.

If I use that fact, can I avoid going through AffineBridge::v_callInto_v ?

-- 
Lionel

Context


Privacy Policy | Impressum (Legal Info) | Copyright information: Unless otherwise specified, all text and images on this website are licensed under the Creative Commons Attribution-Share Alike 3.0 License. This does not include the source code of LibreOffice, which is licensed under the Mozilla Public License (MPLv2). "LibreOffice" and "The Document Foundation" are registered trademarks of their corresponding registered owners or are in actual use as trademarks in one or more countries. Their respective logos and icons are also subject to international copyright laws. Use thereof is explained in our trademark policy.