X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=blobdiff_plain;f=src%2Fcommon%2Finternalpeer.cpp;h=7d8d018692613222528537061f248f3114dd018a;hp=c2512a07cc2d70051e40ed528249a944043214ff;hb=f65431d2916386b93bf3c991578997203dfbc64d;hpb=9f91e0dd3c4eb5c2e2dedfc8d36a068d433d51b1 diff --git a/src/common/internalpeer.cpp b/src/common/internalpeer.cpp index c2512a07..7d8d0186 100644 --- a/src/common/internalpeer.cpp +++ b/src/common/internalpeer.cpp @@ -30,7 +30,9 @@ class PeerMessageEvent : public QEvent { public: PeerMessageEvent(InternalPeer *sender, InternalPeer::EventType eventType, const T &message) - : QEvent(QEvent::Type(eventType)), sender(sender), message(message) {} + : QEvent(QEvent::Type(eventType)), sender(sender), message(message) + {} + InternalPeer *sender; T message; }; @@ -172,6 +174,18 @@ void InternalPeer::dispatch(const InitData &msg) } +namespace { + +void setSourcePeer(Peer* peer) +{ + auto p = SignalProxy::current(); + if (p) + p->setSourcePeer(peer); +} + +} // anon + + template void InternalPeer::dispatch(EventType eventType, const T &msg) { @@ -180,41 +194,39 @@ void InternalPeer::dispatch(EventType eventType, const T &msg) return; } - if(QThread::currentThread() == _peer->thread()) - _peer->handle(msg); - else - QCoreApplication::postEvent(_peer, new PeerMessageEvent(this, eventType, msg)); + // The peers always live in different threads, so use an event for thread-safety + QCoreApplication::postEvent(_peer, new PeerMessageEvent(this, eventType, msg)); } void InternalPeer::customEvent(QEvent *event) { + setSourcePeer(this); + switch ((int)event->type()) { case SyncMessageEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); + handle(static_cast *>(event)->message); break; } case RpcCallEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); + handle(static_cast *>(event)->message); break; } case InitRequestEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); + handle(static_cast *>(event)->message); break; } case InitDataEvent: { - PeerMessageEvent *e = static_cast *>(event); - handle(e->message); + handle(static_cast *>(event)->message); break; } default: qWarning() << Q_FUNC_INFO << "Received unknown custom event:" << event->type(); + setSourcePeer(nullptr); return; } + setSourcePeer(nullptr); event->accept(); }