From f65431d2916386b93bf3c991578997203dfbc64d Mon Sep 17 00:00:00 2001 From: Manuel Nickschas Date: Tue, 27 Mar 2018 00:04:01 +0200 Subject: [PATCH 1/1] common: Set sourcePeer() also for internal (mono) connections So far, SignalProxy::sourcePeer() was only set while processing messages from remote peers. Set this also for internal connections. Also remove InternalPeer's special-casing for in-thread communication, as the two connected peers always live in different threads anyways. Closes GH-345. --- src/common/internalpeer.cpp | 38 ++++++++++++++++++++++++------------- 1 file changed, 25 insertions(+), 13 deletions(-) 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(); } -- 2.20.1