diff --git a/src/kernel/qobject.cpp b/src/kernel/qobject.cpp index 3ab2d9b9..c13ed108 100644 --- a/src/kernel/qobject.cpp +++ b/src/kernel/qobject.cpp @@ -2789,12 +2789,17 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o ) TQSenderObjectList* sol; TQObject* oldSender = 0; TQConnection *c; - if ( clist->count() == 1 ) { // save iterator - c = clist->first(); + TQConnection *cd = 0; + TQConnectionListIt it(*clist); + while ( (c=it.current()) ) { + ++it; + if ( c == cd ) + continue; + cd = c; object = c->object(); sol = object->senderObjects; #ifdef TQT_THREAD_SUPPORT - sol->listMutex->lock(); + sol->listMutex->lock(); #endif // TQT_THREAD_SUPPORT if ( sol ) { oldSender = sol->currentSender; @@ -2802,13 +2807,11 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o ) sol->currentSender = this; } if ( c->memberType() == TQ_SIGNAL_CODE ) { -#if !defined(TQT_THREAD_SUPPORT) - object->tqt_emit( c->member(), o ); -#else // defined(TQT_THREAD_SUPPORT) - if ((d->disableThreadPostedEvents) || - (object->d->disableThreadPostedEvents) || - (currentThread && currentThread->threadPostedEventsDisabled()) || - (currentThread && object->d->ownThread == currentThread)) { +#ifdef TQT_THREAD_SUPPORT + if ((d->disableThreadPostedEvents) || + (object->d->disableThreadPostedEvents) || + (currentThread && currentThread->threadPostedEventsDisabled()) || + (currentThread && object->d->ownThread == currentThread)) { sol->listMutex->unlock(); object->tqt_emit( c->member(), o ); sol->listMutex->lock(); @@ -2816,21 +2819,21 @@ 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", this, c->member(), object); + tqDebug("TQObject::activate_signal: Emitting cross-thread signal from object %p (member %d receiver %p)\n", this, c->member(), object); #endif // QT_DEBUG TQApplication::postEvent(object, new TQMetaCallEvent(c->member(), this, deepCopyTQUObjectArray(o), TQMetaCallEvent::MetaCallEmit)); } } -#endif // !defined(TQT_THREAD_SUPPORT) +#else // !TQT_THREAD_SUPPORT + object->tqt_emit( c->member(), o ); +#endif // TQT_THREAD_SUPPORT } else { -#if !defined(TQT_THREAD_SUPPORT) - object->tqt_invoke( c->member(), o ); -#else // defined(TQT_THREAD_SUPPORT) - if ((d->disableThreadPostedEvents) || - (object->d->disableThreadPostedEvents) || - (currentThread && currentThread->threadPostedEventsDisabled()) || - (currentThread && object->d->ownThread == currentThread)) { +#ifdef TQT_THREAD_SUPPORT + if ((d->disableThreadPostedEvents) || + (object->d->disableThreadPostedEvents) || + (currentThread && currentThread->threadPostedEventsDisabled()) || + (currentThread && object->d->ownThread == currentThread)) { sol->listMutex->unlock(); object->tqt_invoke( c->member(), o ); sol->listMutex->lock(); @@ -2838,18 +2841,20 @@ 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", this, c->member(), object); + tqDebug("TQObject::activate_signal: Invoking cross-thread method from object %p (member %d receiver %p)\n", this, c->member(), object); #endif // QT_DEBUG TQApplication::postEvent(object, new TQMetaCallEvent(c->member(), this, deepCopyTQUObjectArray(o), TQMetaCallEvent::MetaCallInvoke)); } } -#endif // !defined(TQT_THREAD_SUPPORT) +#else // !TQT_THREAD_SUPPORT + object->tqt_invoke( c->member(), o ); +#endif // TQT_THREAD_SUPPORT } - if ( sol ) { + if (sol ) { sol->currentSender = oldSender; if ( sol->deref() ) { #ifdef TQT_THREAD_SUPPORT - sol->listMutex->unlock(); + sol->listMutex->unlock(); #endif // TQT_THREAD_SUPPORT delete sol; sol = NULL; @@ -2858,82 +2863,6 @@ void TQObject::activate_signal( TQConnectionList *clist, TQUObject *o ) #ifdef TQT_THREAD_SUPPORT if (sol) sol->listMutex->unlock(); #endif // TQT_THREAD_SUPPORT - } else { - TQConnection *cd = 0; - TQConnectionListIt it(*clist); - while ( (c=it.current()) ) { - ++it; - if ( c == cd ) - continue; - cd = c; - object = c->object(); - sol = object->senderObjects; -#ifdef TQT_THREAD_SUPPORT - sol->listMutex->lock(); -#endif // TQT_THREAD_SUPPORT - if ( sol ) { - oldSender = sol->currentSender; - sol->ref(); - sol->currentSender = this; - } - if ( c->memberType() == TQ_SIGNAL_CODE ) { -#if !defined(TQT_THREAD_SUPPORT) - object->tqt_emit( c->member(), o ); -#else // defined(TQT_THREAD_SUPPORT) - if ((d->disableThreadPostedEvents) || - (object->d->disableThreadPostedEvents) || - (currentThread && currentThread->threadPostedEventsDisabled()) || - (currentThread && object->d->ownThread == currentThread)) { - sol->listMutex->unlock(); - object->tqt_emit( c->member(), o ); - sol->listMutex->lock(); - } - 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", this, c->member(), object); -#endif // QT_DEBUG - TQApplication::postEvent(object, new TQMetaCallEvent(c->member(), this, deepCopyTQUObjectArray(o), TQMetaCallEvent::MetaCallEmit)); - } - } -#endif // !defined(TQT_THREAD_SUPPORT) - } - else { -#if !defined(TQT_THREAD_SUPPORT) - object->tqt_invoke( c->member(), o ); -#else // defined(TQT_THREAD_SUPPORT) - if ((d->disableThreadPostedEvents) || - (object->d->disableThreadPostedEvents) || - (currentThread && currentThread->threadPostedEventsDisabled()) || - (currentThread && object->d->ownThread == currentThread)) { - sol->listMutex->unlock(); - object->tqt_invoke( c->member(), o ); - sol->listMutex->lock(); - } - 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", this, c->member(), object); -#endif // QT_DEBUG - TQApplication::postEvent(object, new TQMetaCallEvent(c->member(), this, deepCopyTQUObjectArray(o), TQMetaCallEvent::MetaCallInvoke)); - } - } -#endif // !defined(TQT_THREAD_SUPPORT) - } - if (sol ) { - sol->currentSender = oldSender; - if ( sol->deref() ) { -#ifdef TQT_THREAD_SUPPORT - sol->listMutex->unlock(); -#endif // TQT_THREAD_SUPPORT - delete sol; - sol = NULL; - } - } -#ifdef TQT_THREAD_SUPPORT - if (sol) sol->listMutex->unlock(); -#endif // TQT_THREAD_SUPPORT - } } }