From: Manuel Nickschas Date: Sat, 14 Feb 2009 16:03:30 +0000 (+0100) Subject: Don't send WHO if we haven't received a reply for the last one yet X-Git-Tag: 0.4.0~55 X-Git-Url: https://git.quassel-irc.org/?p=quassel.git;a=commitdiff_plain;h=dbef809f160236d05e93256d8309085225b8b928;hp=eb606f89b0f97cbcb69b87e0ae749a05cd473ff2 Don't send WHO if we haven't received a reply for the last one yet Before, we would send WHO in regular intervals even if no reply came back yet. I suspect this, together with network issues, could be the reason for SendQ Exceeded and similar issues. Note that if we miss an ENDWHO reply now somehow, we won't ever send WHO again. I hope this cannot happen. --- diff --git a/src/core/corenetwork.cpp b/src/core/corenetwork.cpp index 32888ecf..a3570441 100644 --- a/src/core/corenetwork.cpp +++ b/src/core/corenetwork.cpp @@ -46,7 +46,7 @@ CoreNetwork::CoreNetwork(const NetworkId &networkid, CoreSession *session) _autoWhoEnabled(true), _autoWhoInterval(90), _autoWhoNickLimit(0), // unlimited - _autoWhoDelay(3) + _autoWhoDelay(5) { _autoReconnectTimer.setSingleShot(true); _socketCloseTimer.setSingleShot(true); @@ -257,7 +257,7 @@ void CoreNetwork::setChannelJoined(const QString &channel) { void CoreNetwork::setChannelParted(const QString &channel) { removeChannelKey(channel); _autoWhoQueue.removeAll(channel.toLower()); - _autoWhoInProgress.remove(channel.toLower()); + _autoWhoPending.remove(channel.toLower()); Core::setChannelPersistent(userId(), networkId(), channel, false); } @@ -275,9 +275,11 @@ void CoreNetwork::removeChannelKey(const QString &channel) { } bool CoreNetwork::setAutoWhoDone(const QString &channel) { - if(_autoWhoInProgress.value(channel.toLower(), 0) <= 0) + QString chan = channel.toLower(); + if(_autoWhoPending.value(chan, 0) <= 0) return false; - _autoWhoInProgress[channel.toLower()]--; + if(--_autoWhoPending[chan] <= 0) + _autoWhoPending.remove(chan); return true; } @@ -341,7 +343,7 @@ void CoreNetwork::socketDisconnected() { _autoWhoCycleTimer.stop(); _autoWhoTimer.stop(); _autoWhoQueue.clear(); - _autoWhoInProgress.clear(); + _autoWhoPending.clear(); _socketCloseTimer.stop(); @@ -536,12 +538,16 @@ void CoreNetwork::disablePingTimeout() { } void CoreNetwork::sendAutoWho() { + // Don't send autowho if there are still some pending + if(_autoWhoPending.count()) + return; + while(!_autoWhoQueue.isEmpty()) { QString chan = _autoWhoQueue.takeFirst(); IrcChannel *ircchan = ircChannel(chan); if(!ircchan) continue; if(_autoWhoNickLimit > 0 && ircchan->ircUsers().count() > _autoWhoNickLimit) continue; - _autoWhoInProgress[chan]++; + _autoWhoPending[chan]++; putRawLine("WHO " + serverEncode(chan)); if(_autoWhoQueue.isEmpty() && _autoWhoEnabled && !_autoWhoCycleTimer.isActive()) { // Timer was stopped, means a new cycle is due immediately diff --git a/src/core/corenetwork.h b/src/core/corenetwork.h index 42ad12d5..c11aee84 100644 --- a/src/core/corenetwork.h +++ b/src/core/corenetwork.h @@ -75,7 +75,7 @@ public: inline QString channelKey(const QString &channel) const { return _channelKeys.value(channel.toLower(), QString()); } - inline bool isAutoWhoInProgress(const QString &channel) const { return _autoWhoInProgress.value(channel.toLower(), 0); } + inline bool isAutoWhoInProgress(const QString &channel) const { return _autoWhoPending.value(channel.toLower(), 0); } inline UserId userId() const { return _coreSession->user(); } @@ -181,7 +181,7 @@ private: bool _autoWhoEnabled; QStringList _autoWhoQueue; - QHash _autoWhoInProgress; + QHash _autoWhoPending; int _autoWhoInterval; int _autoWhoNickLimit; int _autoWhoDelay;