From a89287e4045f73f095570506b60bb9ba8a16e267 Mon Sep 17 00:00:00 2001 From: ZappoMan Date: Tue, 4 Nov 2014 11:01:37 -0800 Subject: [PATCH 1/4] reset the QElapsedTimer in usecTimestampNow() periodically to prevent error --- libraries/shared/src/SharedUtil.cpp | 20 ++++++++++++++++++++ 1 file changed, 20 insertions(+) diff --git a/libraries/shared/src/SharedUtil.cpp b/libraries/shared/src/SharedUtil.cpp index 5801da339f..05d208c2f8 100644 --- a/libraries/shared/src/SharedUtil.cpp +++ b/libraries/shared/src/SharedUtil.cpp @@ -46,6 +46,26 @@ quint64 usecTimestampNow() { TIME_REFERENCE = QDateTime::currentMSecsSinceEpoch() * 1000; // ms to usec timestampTimer.start(); usecTimestampNowIsInitialized = true; + } else { + // We've seen the QElapsedTimer begin to introduce dramatic errors if it's been + // continuously running for a long time. So we will periodically reset it. + const quint64 SECS_TO_NSECS = 1000000000; + const quint64 RESET_AFTER_ELAPSED_SECS = 60 * 60; // 1 hour: 60 minutes * 60 seconds + const quint64 RESET_AFTER_ELAPSED_NSECS = RESET_AFTER_ELAPSED_SECS * SECS_TO_NSECS; + const quint64 nsecsElapsed = timestampTimer.nsecsElapsed(); + if (nsecsElapsed > RESET_AFTER_ELAPSED_NSECS) { + quint64 msecsElapsed = timestampTimer.restart(); + quint64 usecsElapsed = nsecsElapsed / 1000; // nsec to usec + TIME_REFERENCE += usecsElapsed; + const bool wantDebug = false; + if (wantDebug) { + qDebug() << "usecTimestampNow() - resetting QElapsedTimer. "; + qDebug() << " RESET_AFTER_ELAPSED_NSECS:" << RESET_AFTER_ELAPSED_NSECS; + qDebug() << " nsecsElapsed:" << nsecsElapsed; + qDebug() << " msecsElapsed:" << msecsElapsed; + qDebug() << " usecsElapsed:" << usecsElapsed; + } + } } // usec nsec to usec usec From d671dec61b5e868a8bbb764a70afe88c7075459e Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 4 Nov 2014 13:21:48 -0800 Subject: [PATCH 2/4] fix for ice server sock addr in domain-server --- domain-server/src/DomainServer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp index a2198370ce..dbaaca43fa 100644 --- a/domain-server/src/DomainServer.cpp +++ b/domain-server/src/DomainServer.cpp @@ -1148,7 +1148,7 @@ void DomainServer::performICEUpdates() { } void DomainServer::sendHeartbeatToIceServer() { - const HifiSockAddr ICE_SERVER_SOCK_ADDR = HifiSockAddr("ice.highfidelity.io", ICE_SERVER_DEFAULT_PORT); + static HifiSockAddr ICE_SERVER_SOCK_ADDR = HifiSockAddr("ice.highfidelity.io", ICE_SERVER_DEFAULT_PORT); LimitedNodeList::getInstance()->sendHeartbeatToIceServer(ICE_SERVER_SOCK_ADDR); } From d46f775f20597696c24cdcdfe0fd7713e0ef85b7 Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 4 Nov 2014 13:23:53 -0800 Subject: [PATCH 3/4] async and sync nomenclature flip --- libraries/networking/src/HifiSockAddr.cpp | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/libraries/networking/src/HifiSockAddr.cpp b/libraries/networking/src/HifiSockAddr.cpp index 11674a948e..6eec22ab3e 100644 --- a/libraries/networking/src/HifiSockAddr.cpp +++ b/libraries/networking/src/HifiSockAddr.cpp @@ -44,12 +44,12 @@ HifiSockAddr::HifiSockAddr(const QString& hostname, quint16 hostOrderPort, bool if (_address.protocol() != QAbstractSocket::IPv4Protocol) { // lookup the IP by the hostname if (shouldBlockForLookup) { - qDebug() << "Asynchronously looking up IP address for hostname" << hostname; + qDebug() << "Synchronously looking up IP address for hostname" << hostname; QHostInfo result = QHostInfo::fromName(hostname); handleLookupResult(result); } else { int lookupID = QHostInfo::lookupHost(hostname, this, SLOT(handleLookupResult(QHostInfo))); - qDebug() << "Synchronously looking up IP address for hostname" << hostname << "- lookup ID is" << lookupID; + qDebug() << "Asynchronously looking up IP address for hostname" << hostname << "- lookup ID is" << lookupID; } } } From beb350d1e702368fc3fbbfa7b47f6b196f3ad2fe Mon Sep 17 00:00:00 2001 From: Stephen Birarda Date: Tue, 4 Nov 2014 13:53:56 -0800 Subject: [PATCH 4/4] fix for HifiSockAddr lookup for ice server from DomainHandler --- libraries/networking/src/DomainHandler.cpp | 6 +++++- libraries/networking/src/HifiSockAddr.cpp | 21 +++++++++++---------- 2 files changed, 16 insertions(+), 11 deletions(-) diff --git a/libraries/networking/src/DomainHandler.cpp b/libraries/networking/src/DomainHandler.cpp index 81d6a6d662..d64752dce0 100644 --- a/libraries/networking/src/DomainHandler.cpp +++ b/libraries/networking/src/DomainHandler.cpp @@ -14,6 +14,7 @@ #include #include "Assignment.h" +#include "HifiSockAddr.h" #include "NodeList.h" #include "PacketHeaders.h" #include "UserActivityLogger.h" @@ -144,7 +145,10 @@ void DomainHandler::setIceServerHostnameAndID(const QString& iceServerHostname, hardReset(); _iceDomainID = id; - _iceServerSockAddr = HifiSockAddr(iceServerHostname, ICE_SERVER_DEFAULT_PORT); + + HifiSockAddr* replaceableSockAddr = &_iceServerSockAddr; + replaceableSockAddr->~HifiSockAddr(); + replaceableSockAddr = new (replaceableSockAddr) HifiSockAddr(iceServerHostname, ICE_SERVER_DEFAULT_PORT); // refresh our ICE client UUID to something new _iceClientID = QUuid::createUuid(); diff --git a/libraries/networking/src/HifiSockAddr.cpp b/libraries/networking/src/HifiSockAddr.cpp index 6eec22ab3e..f2419f5124 100644 --- a/libraries/networking/src/HifiSockAddr.cpp +++ b/libraries/networking/src/HifiSockAddr.cpp @@ -31,9 +31,17 @@ HifiSockAddr::HifiSockAddr(const QHostAddress& address, quint16 port) : } -HifiSockAddr::HifiSockAddr(const HifiSockAddr& otherSockAddr) { - _address = otherSockAddr._address; - _port = otherSockAddr._port; +HifiSockAddr::HifiSockAddr(const HifiSockAddr& otherSockAddr) : + _address(otherSockAddr._address), + _port(otherSockAddr._port) +{ + +} + +HifiSockAddr& HifiSockAddr::operator=(const HifiSockAddr& rhsSockAddr) { + HifiSockAddr temp(rhsSockAddr); + swap(temp); + return *this; } HifiSockAddr::HifiSockAddr(const QString& hostname, quint16 hostOrderPort, bool shouldBlockForLookup) : @@ -64,13 +72,6 @@ HifiSockAddr::HifiSockAddr(const sockaddr* sockaddr) { } } -HifiSockAddr& HifiSockAddr::operator=(const HifiSockAddr& rhsSockAddr) { - _address = rhsSockAddr._address; - _port = rhsSockAddr._port; - - return *this; -} - void HifiSockAddr::swap(HifiSockAddr& otherSockAddr) { using std::swap;