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