https://bugs.freedesktop.org/show_bug.cgi?id=63391

          Priority: medium
            Bug ID: 63391
          Assignee: libreoffice-bugs@lists.freedesktop.org
           Summary: race condition (freeze) between "convert macros" and
                    "connect DB" in FileOpen event
          Severity: major
    Classification: Unclassified
                OS: All
          Reporter: lio...@mamane.lu
          Hardware: All
            Status: UNCONFIRMED
           Version: 3.6.3.2 release
         Component: Database
           Product: LibreOffice

Created attachment 77759
  --> https://bugs.freedesktop.org/attachment.cgi?id=77759&action=edit
More detailed notes, with full backtraces, etc

Let foo.odb be a database file that has this macro on "Open Document" event:


Sub Foo
    Dim DBDocUI as Object
    DBDocUI = ThisDatabaseDocument.currentController
    if not DBDocUI.isConnected then
        DBDocUI.connect
    end if
End Sub

The effect of this macro is to immediately connect to the database when opening
foo.odb, instead of lazily waiting for something to need it. (I do that because
I then use "stmt.executeUpdate()" to set various DBMS-specific settings
automatically.)

Sometimes, but now always, when opening this file, LibreOffice freezes.

I've tracked it down to a race condition between two actions:

 1) the asynchronous treatment of "OnFirstControllerConnected" in
dbaui::OApplicationController,
    which tries to get dbaui::OApplicationController's mutex

 2) the StarBasic macro calling dbaui::OApplicationController::connect
    which needs to display a dialog (to get username and password),
    and thus puts that dialog in the main thread's event queue
    and waits for it ... with dbaui::OApplicationController's mutex held

Now, if "1)" is before "2)" in the event queue of the the main thread,
*but* "1)" is executed *after* "2)" has taken the lock, there is a deadlock.

Fix:

 1) Make OnFirstControllerConnected synchronous.
    Make sure (by taking mutex in dbaui::OApplicationController::attachFrame,
its ancestor in the call graph)
    that nothing else will happen with the OApplicationController as long as it
is not finished.
    ---> it does not need to take mutex itself anymore

 2) Change dbaui::OApplicationController::ensureConnection to do the user
prompting
    WITHOUT HOLDING the mutex, and use the mutex "only" to protect actually
assigning
    the connection to m_xDataSourceConnection.

    Theoretically, in some race condition, we could connect twice and then
discard one connection <shrug>.
    ensureConnection will never return the discarded connection, though.

    (I think I got that right with respect to
http://www.cs.umd.edu/~pugh/java/memoryModel/DoubleCheckedLocking.html)

    This keeps it from locking on another condition while holding the mutex.

-- 
You are receiving this mail because:
You are the assignee for the bug.
_______________________________________________
Libreoffice-bugs mailing list
Libreoffice-bugs@lists.freedesktop.org
http://lists.freedesktop.org/mailman/listinfo/libreoffice-bugs

Reply via email to