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
This commit is contained in:
Caolán McNamara 2012-09-12 13:44:09 +01:00
parent 4597483e00
commit b0759366fc
2 changed files with 20 additions and 0 deletions

View file

@ -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
*/

View file

@ -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] );