summaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/kernel/ntqthread.h5
-rw-r--r--src/kernel/qeventloop_unix_glib.cpp4
-rw-r--r--src/kernel/qobject.cpp20
-rw-r--r--src/kernel/qthread.cpp23
-rw-r--r--src/kernel/qthread_unix.cpp8
-rw-r--r--src/tools/qthreadinstance_p.h1
6 files changed, 53 insertions, 8 deletions
diff --git a/src/kernel/ntqthread.h b/src/kernel/ntqthread.h
index 5a8327101..04684ac0a 100644
--- a/src/kernel/ntqthread.h
+++ b/src/kernel/ntqthread.h
@@ -113,9 +113,12 @@ public:
CleanupMergeObjects
};
- CleanupType cleanupType();
+ CleanupType cleanupType() const;
void setCleanupType(CleanupType);
+ bool threadPostedEventsDisabled() const;
+ void setThreadPostedEventsDisabled(bool);
+
protected:
virtual void run() = 0;
diff --git a/src/kernel/qeventloop_unix_glib.cpp b/src/kernel/qeventloop_unix_glib.cpp
index 1decd8f1b..795dc9ba8 100644
--- a/src/kernel/qeventloop_unix_glib.cpp
+++ b/src/kernel/qeventloop_unix_glib.cpp
@@ -688,7 +688,7 @@ int TQEventLoop::activateTimers()
TQTimerEvent e( t->id );
#if defined(QT_THREAD_SUPPORT)
// Be careful...the current thread may not be the target object's thread!
- if ((!t->obj) || (t->obj && (t->obj->contextThreadObject() == TQThread::currentThreadObject()))) {
+ if ((!t->obj) || (TQThread::currentThreadObject()->threadPostedEventsDisabled()) || (t->obj && (t->obj->contextThreadObject() == TQThread::currentThreadObject()))) {
TQApplication::sendEvent( t->obj, &e ); // send event
}
else {
@@ -731,7 +731,7 @@ int TQEventLoop::activateSocketNotifiers()
sn->pending = FALSE;
#if defined(QT_THREAD_SUPPORT)
// Be careful...the current thread may not be the target object's thread!
- if ((!sn->obj) || (sn->obj && (sn->obj->contextThreadObject() == TQThread::currentThreadObject()))) {
+ if ((!sn->obj) || (TQThread::currentThreadObject()->threadPostedEventsDisabled()) || (sn->obj && (sn->obj->contextThreadObject() == TQThread::currentThreadObject()))) {
TQApplication::sendEvent( sn->obj, &event ); // send event
}
else {
diff --git a/src/kernel/qobject.cpp b/src/kernel/qobject.cpp
index d8b2047a0..4442023a5 100644
--- a/src/kernel/qobject.cpp
+++ b/src/kernel/qobject.cpp
@@ -2727,7 +2727,7 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o )
sol->currentSender = this;
}
if ( c->memberType() == TQSIGNAL_CODE ) {
- if ((d->disableThreadPostedEvents) || (object->d->ownThread == currentThread)) {
+ if ((d->disableThreadPostedEvents) || (object->d->disableThreadPostedEvents) || (currentThread->threadPostedEventsDisabled()) || (object->d->ownThread == currentThread)) {
#ifdef QT_THREAD_SUPPORT
sol->listMutex->unlock();
#endif // QT_THREAD_SUPPORT
@@ -2738,12 +2738,15 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o )
}
else {
if (object->d->ownThread && !object->d->ownThread->finished()) {
+#ifdef QT_DEBUG
+ tqDebug("TQObject::activate_signal: Emitting cross-thread signal from object %p (member %d receiver %p) (1)\n\r", this, c->member(), object);
+#endif // QT_DEBUG
TQApplication::postEvent(object, new TQMetaCallEvent(c->member(), this, deepCopyTQUObjectArray(o), TQMetaCallEvent::MetaCallEmit));
}
}
}
else {
- if ((d->disableThreadPostedEvents) || (object->d->ownThread == currentThread)) {
+ if ((d->disableThreadPostedEvents) || (object->d->disableThreadPostedEvents) || (currentThread->threadPostedEventsDisabled()) || (object->d->ownThread == currentThread)) {
#ifdef QT_THREAD_SUPPORT
sol->listMutex->unlock();
#endif // QT_THREAD_SUPPORT
@@ -2754,6 +2757,9 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o )
}
else {
if (object->d->ownThread && !object->d->ownThread->finished()) {
+#ifdef QT_DEBUG
+ tqDebug("TQObject::activate_signal: Invoking cross-thread method from object %p (member %d receiver %p) (1)\n\r", this, c->member(), object);
+#endif // QT_DEBUG
TQApplication::postEvent(object, new TQMetaCallEvent(c->member(), this, deepCopyTQUObjectArray(o), TQMetaCallEvent::MetaCallInvoke));
}
}
@@ -2788,7 +2794,7 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o )
sol->currentSender = this;
}
if ( c->memberType() == TQSIGNAL_CODE ) {
- if ((d->disableThreadPostedEvents) || (object->d->ownThread == currentThread)) {
+ if ((d->disableThreadPostedEvents) || (object->d->disableThreadPostedEvents) || (currentThread->threadPostedEventsDisabled()) || (object->d->ownThread == currentThread)) {
#ifdef QT_THREAD_SUPPORT
sol->listMutex->unlock();
#endif // QT_THREAD_SUPPORT
@@ -2799,12 +2805,15 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o )
}
else {
if (object->d->ownThread && !object->d->ownThread->finished()) {
+#ifdef QT_DEBUG
+ tqDebug("TQObject::activate_signal: Emitting cross-thread signal from object %p (member %d receiver %p) (2)\n\r", this, c->member(), object);
+#endif // QT_DEBUG
TQApplication::postEvent(object, new TQMetaCallEvent(c->member(), this, deepCopyTQUObjectArray(o), TQMetaCallEvent::MetaCallEmit));
}
}
}
else {
- if ((d->disableThreadPostedEvents) || (object->d->ownThread == currentThread)) {
+ if ((d->disableThreadPostedEvents) || (object->d->disableThreadPostedEvents) || (currentThread->threadPostedEventsDisabled()) || (object->d->ownThread == currentThread)) {
#ifdef QT_THREAD_SUPPORT
sol->listMutex->unlock();
#endif // QT_THREAD_SUPPORT
@@ -2815,6 +2824,9 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o )
}
else {
if (object->d->ownThread && !object->d->ownThread->finished()) {
+#ifdef QT_DEBUG
+ tqDebug("TQObject::activate_signal: Invoking cross-thread method from object %p (member %d receiver %p) (2)\n\r", this, c->member(), object);
+#endif // QT_DEBUG
TQApplication::postEvent(object, new TQMetaCallEvent(c->member(), this, deepCopyTQUObjectArray(o), TQMetaCallEvent::MetaCallInvoke));
}
}
diff --git a/src/kernel/qthread.cpp b/src/kernel/qthread.cpp
index 7c8820087..86accebba 100644
--- a/src/kernel/qthread.cpp
+++ b/src/kernel/qthread.cpp
@@ -224,6 +224,29 @@ bool TQThread::running() const
}
/*!
+ Changes the way cross thread signals are handled
+ If disable is FALSE, signals emitted from this thread will be
+ posted to any other connected threads' event loops (default).
+
+ If disable is TRUE, calls to emit from this thread
+ will immediately execute slots in another thread.
+ This mode of operation is inherently unsafe and is provided
+ solely to support thread management by a third party application.
+ */
+void TQThread::setThreadPostedEventsDisabled(bool disable)
+{
+ d->disableThreadPostedEvents = disable;
+}
+
+/*!
+ Returns TRUE if thread posted events are disabled, FALSE if not
+ */
+bool TQThread::threadPostedEventsDisabled() const
+{
+ return d->disableThreadPostedEvents;
+}
+
+/*!
\fn void TQThread::run()
This method is pure virtual, and must be implemented in derived
diff --git a/src/kernel/qthread_unix.cpp b/src/kernel/qthread_unix.cpp
index fb8f45318..6e8c4fdc3 100644
--- a/src/kernel/qthread_unix.cpp
+++ b/src/kernel/qthread_unix.cpp
@@ -105,6 +105,7 @@ void TQThreadInstance::init(unsigned int stackSize)
finished = FALSE;
running = FALSE;
orphan = FALSE;
+ disableThreadPostedEvents = FALSE;
pthread_cond_init(&thread_done, NULL);
thread_id = 0;
@@ -130,6 +131,9 @@ void *TQThreadInstance::start( void *_arg )
((TQThreadInstance*)arg[1])->thread_id = pthread_self();
#endif // QT_USE_GLIBMAINLOOP
+#ifdef QT_DEBUG
+ tqDebug("TQThreadInstance::start: Setting thread storage to %p\n\r", (TQThread *) arg[0]);
+#endif // QT_DEBUG
setCurrentThread( (TQThread *) arg[0] );
pthread_cleanup_push( TQThreadInstance::finish, arg[1] );
@@ -152,6 +156,8 @@ void TQThreadInstance::finish( void * )
return;
}
+ tqDebug("TQThreadInstance::finish: In TQThreadInstance::finish for thread %p\n\r", (TQThread*)d->args[0]);
+
TQApplication::threadTerminationHandler((TQThread*)d->args[0]);
TQMutexLocker locker( d->mutex() );
@@ -510,7 +516,7 @@ bool TQThread::wait( unsigned long time )
\sa CleanupType
*/
-TQThread::CleanupType TQThread::cleanupType() {
+TQThread::CleanupType TQThread::cleanupType() const {
return (TQThread::CleanupType)d->cleanupType;
}
diff --git a/src/tools/qthreadinstance_p.h b/src/tools/qthreadinstance_p.h
index 4d5bff993..9fae260ed 100644
--- a/src/tools/qthreadinstance_p.h
+++ b/src/tools/qthreadinstance_p.h
@@ -102,6 +102,7 @@ public:
TQEventLoop* eventLoop;
int cleanupType;
+ bool disableThreadPostedEvents : 1;
};
#endif // QT_THREAD_SUPPORT