Kaydet (Commit) b0759366 authored tarafından Caolán McNamara's avatar Caolán McNamara

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
üst 4597483e
...@@ -322,6 +322,12 @@ int X11SalData::XErrorHdl( Display *pDisplay, XErrorEvent *pEvent ) ...@@ -322,6 +322,12 @@ int X11SalData::XErrorHdl( Display *pDisplay, XErrorEvent *pEvent )
int X11SalData::XIOErrorHdl( Display * ) int X11SalData::XIOErrorHdl( Display * )
{ {
if (::osl::Thread::getCurrentIdentifier() != Application::GetMainThreadIdentifier())
{
pthread_exit(NULL);
return 0;
}
/* #106197# hack: until a real shutdown procedure exists /* #106197# hack: until a real shutdown procedure exists
* _exit ASAP * _exit ASAP
*/ */
......
...@@ -526,6 +526,18 @@ GtkData::GtkData( SalInstance *pInstance ) ...@@ -526,6 +526,18 @@ GtkData::GtkData( SalInstance *pInstance )
m_aDispatchCondition = osl_createCondition(); 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() GtkData::~GtkData()
{ {
Yield( true, true ); Yield( true, true );
...@@ -545,6 +557,7 @@ GtkData::~GtkData() ...@@ -545,6 +557,7 @@ GtkData::~GtkData()
osl_destroyCondition( m_aDispatchCondition ); osl_destroyCondition( m_aDispatchCondition );
osl_releaseMutex( m_aDispatchMutex ); osl_releaseMutex( m_aDispatchMutex );
osl_destroyMutex( m_aDispatchMutex ); osl_destroyMutex( m_aDispatchMutex );
XSetIOErrorHandler(aOrigXIOErrorHandler);
} }
void GtkData::Dispose() void GtkData::Dispose()
...@@ -664,6 +677,7 @@ void GtkData::Init() ...@@ -664,6 +677,7 @@ void GtkData::Init()
// init gtk/gdk // init gtk/gdk
gtk_init_check( &nParams, &pCmdLineAry ); gtk_init_check( &nParams, &pCmdLineAry );
gdk_error_trap_push(); gdk_error_trap_push();
aOrigXIOErrorHandler = XSetIOErrorHandler(XIOErrorHdl);
for (i = 0; i < nParams; i++ ) for (i = 0; i < nParams; i++ )
g_free( pCmdLineAry[i] ); g_free( pCmdLineAry[i] );
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment