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


On Wed, Jun 03, 2015 at 02:19:04PM +0200, Lionel Elie Mamane wrote:
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!
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
(...)
#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
(...)
#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 ?

I tried to do that in the attached patch, but as I was explained on
IRC, because the jdbc driver is in an affine component, that does not
work.

-- 
Lionel
diff --git a/connectivity/Library_hsqldb.mk b/connectivity/Library_hsqldb.mk
index 5fd647c..b97590b 100644
--- a/connectivity/Library_hsqldb.mk
+++ b/connectivity/Library_hsqldb.mk
@@ -26,6 +26,7 @@ $(eval $(call gb_Library_use_libraries,hsqldb,\
        cppu \
        cppuhelper \
        dbtools \
+       jdbc \
        jvmfwk \
        sal \
        salhelper \
diff --git a/connectivity/source/drivers/hsqldb/HDriver.cxx 
b/connectivity/source/drivers/hsqldb/HDriver.cxx
index 87eb271..b533819 100644
--- a/connectivity/source/drivers/hsqldb/HDriver.cxx
+++ b/connectivity/source/drivers/hsqldb/HDriver.cxx
@@ -21,6 +21,7 @@
 
 #include "hsqldb/HDriver.hxx"
 #include "hsqldb/HConnection.hxx"
+#include "java/sql/Connection.hxx"
 #include <osl/diagnose.h>
 #include <connectivity/dbexception.hxx>
 #include <com/sun/star/configuration/theDefaultProvider.hpp>
@@ -613,8 +614,14 @@ namespace connectivity
 
     void ODriverDelegator::flushConnections()
     {
-        TWeakPairVector::iterator aEnd = m_aConnections.end();
-        for (TWeakPairVector::iterator i = m_aConnections.begin(); aEnd != i; ++i)
+        TWeakPairVector connections;
+        {
+            ::osl::MutexGuard aGuard(m_aMutex);
+            connections = m_aConnections;
+        }
+
+        TWeakPairVector::const_iterator aEnd = connections.end();
+        for (TWeakPairVector::iterator i = connections.begin(); aEnd != i; ++i)
         {
             try
             {
@@ -648,15 +655,17 @@ namespace connectivity
                     Reference<XConnection> xConnection(i->first,UNO_QUERY);
                     if ( xConnection.is() )
                     {
-                        Reference< XStatement> xStmt = xConnection->createStatement();
+                        rtl::Reference<java_sql_Connection> 
pConnection(dynamic_cast<java_sql_Connection*>(xConnection.get()));
+                        assert(pConnection.is());
+                        Reference< XStatement> xStmt = pConnection->createStatement();
                         OSL_ENSURE( xStmt.is(), "ODriverDelegator::preCommit: no statement!" );
                         if ( xStmt.is() )
                             xStmt->execute( OUString(  "SET WRITE_DELAY 0"  ) );
 
-                        bool bPreviousAutoCommit = xConnection->getAutoCommit();
-                        xConnection->setAutoCommit( sal_False );
-                        xConnection->commit();
-                        xConnection->setAutoCommit( bPreviousAutoCommit );
+                        bool bPreviousAutoCommit = pConnection->getAutoCommit();
+                        pConnection->setAutoCommit( sal_False );
+                        pConnection->commit();
+                        pConnection->setAutoCommit( bPreviousAutoCommit );
 
                         if ( xStmt.is() )
                             xStmt->execute( OUString(  "SET WRITE_DELAY 60"  ) );
diff --git a/connectivity/source/inc/java/sql/Connection.hxx 
b/connectivity/source/inc/java/sql/Connection.hxx
index 47281e4..c521d95 100644
--- a/connectivity/source/inc/java/sql/Connection.hxx
+++ b/connectivity/source/inc/java/sql/Connection.hxx
@@ -37,7 +37,7 @@ namespace connectivity
 
     typedef OMetaConnection     java_sql_Connection_BASE;
 
-    class java_sql_Connection : public java_sql_Connection_BASE,
+    class SAL_DLLPUBLIC_EXPORT java_sql_Connection : public java_sql_Connection_BASE,
                                 public java_lang_Object,
                                 public OSubComponent<java_sql_Connection, 
java_sql_Connection_BASE>,
                                 public OAutoRetrievingBase
diff --git a/dbaccess/JunitTest_dbaccess_complex.mk b/dbaccess/JunitTest_dbaccess_complex.mk
index e3f2c00..913d7aa 100644
--- a/dbaccess/JunitTest_dbaccess_complex.mk
+++ b/dbaccess/JunitTest_dbaccess_complex.mk
@@ -25,8 +25,7 @@ $(eval $(call gb_JunitTest_set_defs,dbaccess_complex,\
 ))
 
 $(eval $(call gb_JunitTest_add_classes,dbaccess_complex,\
-    complex.dbaccess.Beamer \
-    complex.dbaccess.PropertyBag \
+       complex.dbaccess.RowSet \
 ))
 
 $(eval $(call gb_JunitTest_add_sourcefiles,dbaccess_complex,\
diff --git a/dbaccess/qa/complex/dbaccess/RowSet.java b/dbaccess/qa/complex/dbaccess/RowSet.java
index 156776a..149f77c 100644
--- a/dbaccess/qa/complex/dbaccess/RowSet.java
+++ b/dbaccess/qa/complex/dbaccess/RowSet.java
@@ -207,23 +207,31 @@ public class RowSet extends TestCase
         System.out.println("testing testRowSet");
         createTestCase(true);
 
+        System.out.println("testing testRowSet sequential");
         // sequential positioning
         m_resultSet.beforeFirst();
         testSequentialPositining(m_resultSet, m_row);
 
+        System.out.println("testing testRowSet absolute");
         // absolute positioning
         testAbsolutePositioning(m_resultSet, m_row);
 
+        System.out.println("testing testRowSet modify");
         // position during modify
         testModifyPosition(m_resultSet, m_row);
 
+        System.out.println("testing testRowSet 3rd");
         // 3rd test
         test3(createClone(), m_resultSet);
+        System.out.println("testing testRowSet 4th");
         // 4th test
         test4(m_resultSet);
+        System.out.println("finished testing testRowSet 4th");
 
+        // System.out.println("testing testRowSet concurrent");
         // concurrent (multi threaded) access to the row set and its clones
-        testConcurrentAccess(m_resultSet);
+        // testConcurrentAccess(m_resultSet);
+        // System.out.println("finished testRowSet concurrent");
     }
 
 
@@ -400,7 +408,7 @@ public class RowSet extends TestCase
     }
 
 
-    @Test
+    // @Test
     public void testRowSetEvents() throws java.lang.Exception
     {
         System.out.println("testing RowSet Events");
@@ -756,7 +764,7 @@ public class RowSet extends TestCase
     /** checks whether deletions on the main RowSet properly interfere (or don't interfere) with 
the movement
      *  on a clone of the RowSet
      */
-    @Test
+    // @Test
     public void testCloneMovesPlusDeletions() throws SQLException, UnknownPropertyException, 
WrappedTargetException
     {
         createTestCase(true);
@@ -825,7 +833,7 @@ public class RowSet extends TestCase
     /** checks whether insertions on the main RowSet properly interfere (or don't interfere) with 
the movement
      *  on a clone of the RowSet
      */
-    @Test
+    // @Test
     public void testCloneMovesPlusInsertions() throws SQLException, UnknownPropertyException, 
WrappedTargetException, PropertyVetoException, com.sun.star.lang.IllegalArgumentException
     {
         createTestCase(true);
@@ -1011,7 +1019,7 @@ public class RowSet extends TestCase
 
     /** checks the XParametersSupplier functionality of a RowSet
      */
-    @Test
+    // @Test
     public void testParameters()
     {
         createTestCase(false);

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.