[Libreoffice-commits] .: vcl/unx

Libreoffice Gerrit user logerrit at kemper.freedesktop.org
Wed Sep 12 06:02:36 PDT 2012


 vcl/unx/generic/app/saldata.cxx |    6 ++++++
 vcl/unx/gtk/app/gtkdata.cxx     |   14 ++++++++++++++
 2 files changed, 20 insertions(+)

New commits:
commit b0759366fc6cdda2db2f2cb4208df36c1b1fe8fc
Author: Caolán McNamara <caolanm at redhat.com>
Date:   Wed Sep 12 13:44:09 2012 +0100

    Resolves: rhbz#855541 XIOError handler multithread woes
    
    We have two threads using X, on an XIOError both
    threads call their XIOError handlers and two
    calls to exit trample all over eachother.
    
    Change-Id: I20defc6f84cc6ea2372a0d6c979e8078fe920a88

diff --git a/vcl/unx/generic/app/saldata.cxx b/vcl/unx/generic/app/saldata.cxx
index 1fb6a7a..0596dce 100644
--- a/vcl/unx/generic/app/saldata.cxx
+++ b/vcl/unx/generic/app/saldata.cxx
@@ -322,6 +322,12 @@ int X11SalData::XErrorHdl( Display *pDisplay, XErrorEvent *pEvent )
 
 int X11SalData::XIOErrorHdl( Display * )
 {
+    if (::osl::Thread::getCurrentIdentifier() != Application::GetMainThreadIdentifier())
+    {
+        pthread_exit(NULL);
+        return 0;
+    }
+
     /*  #106197# hack: until a real shutdown procedure exists
      *  _exit ASAP
      */
diff --git a/vcl/unx/gtk/app/gtkdata.cxx b/vcl/unx/gtk/app/gtkdata.cxx
index 8f3151c..867883f 100644
--- a/vcl/unx/gtk/app/gtkdata.cxx
+++ b/vcl/unx/gtk/app/gtkdata.cxx
@@ -526,6 +526,18 @@ GtkData::GtkData( SalInstance *pInstance )
     m_aDispatchCondition = osl_createCondition();
 }
 
+XIOErrorHandler aOrigXIOErrorHandler = NULL;
+
+int XIOErrorHdl(Display *pDisplay)
+{
+    if (::osl::Thread::getCurrentIdentifier() != Application::GetMainThreadIdentifier())
+    {
+        pthread_exit(NULL);
+        return 0;
+    }
+    return aOrigXIOErrorHandler ? aOrigXIOErrorHandler(pDisplay) : 0;
+}
+
 GtkData::~GtkData()
 {
     Yield( true, true );
@@ -545,6 +557,7 @@ GtkData::~GtkData()
     osl_destroyCondition( m_aDispatchCondition );
     osl_releaseMutex( m_aDispatchMutex );
     osl_destroyMutex( m_aDispatchMutex );
+    XSetIOErrorHandler(aOrigXIOErrorHandler);
 }
 
 void GtkData::Dispose()
@@ -664,6 +677,7 @@ void GtkData::Init()
     // init gtk/gdk
     gtk_init_check( &nParams, &pCmdLineAry );
     gdk_error_trap_push();
+    aOrigXIOErrorHandler = XSetIOErrorHandler(XIOErrorHdl);
 
     for (i = 0; i < nParams; i++ )
         g_free( pCmdLineAry[i] );


More information about the Libreoffice-commits mailing list