summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-02-12 18:15:11 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2013-02-12 18:15:11 -0600
commit5aa389f311cae593530b0d0f500d67b10f7dd494 (patch)
tree42196e059e217eaea46f22e82f9ec312909ddf6c
parent5df139de988197954c554b832e8bc6fcf48f54a1 (diff)
downloadqt3-5aa389f311cae593530b0d0f500d67b10f7dd494.tar.gz
qt3-5aa389f311cae593530b0d0f500d67b10f7dd494.zip
Fix GTK threading deadlock
-rw-r--r--src/kernel/qeventloop_glib_p.h3
-rw-r--r--src/kernel/qeventloop_x11_glib.cpp32
2 files changed, 25 insertions, 10 deletions
diff --git a/src/kernel/qeventloop_glib_p.h b/src/kernel/qeventloop_glib_p.h
index 663f20e..3fa3593 100644
--- a/src/kernel/qeventloop_glib_p.h
+++ b/src/kernel/qeventloop_glib_p.h
@@ -100,6 +100,8 @@ public:
exitloop = FALSE;
shortcut = FALSE;
singletoolkit = TRUE;
+ ctx = 0;
+ ctx_is_default = false;
}
int looplevel;
@@ -129,6 +131,7 @@ public:
// main context
GMainContext *ctx;
+ bool ctx_is_default;
};
#endif // QEVENTLOOP_GLIB_P_H
diff --git a/src/kernel/qeventloop_x11_glib.cpp b/src/kernel/qeventloop_x11_glib.cpp
index 877ff44..d37fbee 100644
--- a/src/kernel/qeventloop_x11_glib.cpp
+++ b/src/kernel/qeventloop_x11_glib.cpp
@@ -79,8 +79,7 @@ static GSourceFuncs qt_gsource_funcs = {
// forward main loop callbacks to QEventLoop methods!
-static gboolean qt_gsource_prepare ( GSource *source,
- gint *timeout )
+static gboolean qt_gsource_prepare ( GSource *source, gint *timeout )
{
QtGSource * qtGSource = (QtGSource*) source;
QEventLoop* candidateEventLoop = qtGSource->qeventLoop;
@@ -95,7 +94,7 @@ static gboolean qt_gsource_prepare ( GSource *source,
}
}
-static gboolean qt_gsource_check ( GSource *source )
+static gboolean qt_gsource_check ( GSource *source )
{
QtGSource * qtGSource = (QtGSource*) source;
QEventLoop* candidateEventLoop = qtGSource->qeventLoop;
@@ -110,8 +109,7 @@ static gboolean qt_gsource_check ( GSource *source )
}
}
-static gboolean qt_gsource_dispatch ( GSource *source,
- GSourceFunc callback, gpointer user_data )
+static gboolean qt_gsource_dispatch ( GSource *source, GSourceFunc callback, gpointer user_data )
{
Q_UNUSED(callback);
Q_UNUSED(user_data);
@@ -215,6 +213,7 @@ void QEventLoop::init()
// new main context for thread
d->ctx = g_main_context_new();
g_main_context_push_thread_default(d->ctx);
+ d->ctx_is_default = true;
// new GSource
QtGSource * qtGSource = (QtGSource*) g_source_new(&qt_gsource_funcs, sizeof(QtGSource));
@@ -241,9 +240,9 @@ void QEventLoop::init()
d->threadPipe_gPollFD.fd = d->thread_pipe[0];
d->threadPipe_gPollFD.events = G_IO_IN | G_IO_HUP | G_IO_ERR;
- g_source_add_poll(d->gSource, &d->threadPipe_gPollFD);
+ g_source_add_poll(d->gSource, &d->threadPipe_gPollFD);
-#ifdef DEBUG_QT_GLIBMAINLOOP
+#ifdef DEBUG_QT_GLIBMAINLOOP
printf("inside init(2)\n");
#endif
@@ -375,7 +374,7 @@ bool QEventLoop::processX11Events()
}
-bool QEventLoop::gsourcePrepare(GSource *gs, int * timeout)
+bool QEventLoop::gsourcePrepare(GSource *gs, int * timeout)
{
Q_UNUSED(gs);
@@ -428,7 +427,7 @@ bool QEventLoop::gsourcePrepare(GSource *gs, int * timeout)
#ifdef DEBUG_QT_GLIBMAINLOOP
printf("inside gsourcePrepare(2) canwait=%d\n", canWait);
-#endif
+#endif
if ( canWait ) {
emit aboutToBlock();
@@ -440,7 +439,7 @@ bool QEventLoop::gsourcePrepare(GSource *gs, int * timeout)
(**it)();
}
-#ifdef DEBUG_QT_GLIBMAINLOOP
+#ifdef DEBUG_QT_GLIBMAINLOOP
printf("inside gsourcePrepare(2.1) canwait=%d\n", canWait);
#endif
@@ -649,4 +648,17 @@ void QEventLoop::appClosingDown()
void QEventLoop::setSingleToolkitEventHandling(bool enabled) {
d->singletoolkit = enabled;
+
+ if (!d->singletoolkit) {
+ if (d->ctx_is_default) {
+ d->ctx_is_default = false;
+ g_main_context_pop_thread_default(d->ctx);
+ }
+ }
+ else {
+ if (!d->ctx_is_default) {
+ g_main_context_push_thread_default(d->ctx);
+ d->ctx_is_default = true;
+ }
+ }
} \ No newline at end of file