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:
parent
4597483e00
commit
b0759366fc
2 changed files with 20 additions and 0 deletions
|
@ -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] );
|
||||
|
|
Loading…
Reference in a new issue