From e12ed1c5d62fc9ba15aac1919e000a34237665d6 Mon Sep 17 00:00:00 2001
From: Roxanne Skelly <roxanne@highfidelity.io>
Date: Thu, 30 May 2019 14:17:19 -0700
Subject: [PATCH] high_resolution_clock behaves differently on windows and
 linux on linux, time_since_epoch returns time since linux epoch, on windows,
 it returns time since system start. Math between those values on two
 different types of machines was coming out bad.

---
 domain-server/src/DomainServer.cpp    |  4 ++--
 libraries/networking/src/NodeList.cpp | 13 ++++++-------
 2 files changed, 8 insertions(+), 9 deletions(-)

diff --git a/domain-server/src/DomainServer.cpp b/domain-server/src/DomainServer.cpp
index 9a2aaca18b..3613b5e886 100644
--- a/domain-server/src/DomainServer.cpp
+++ b/domain-server/src/DomainServer.cpp
@@ -1174,8 +1174,8 @@ void DomainServer::sendDomainListToNode(const SharedNodePointer& node, quint64 r
     extendedHeaderStream << node->getPermissions();
     extendedHeaderStream << limitedNodeList->getAuthenticatePackets();
     extendedHeaderStream << nodeData->getLastDomainCheckinTimestamp();
-    extendedHeaderStream << requestPacketReceiveTime;
-    extendedHeaderStream << quint64(duration_cast<microseconds>(p_high_resolution_clock::now().time_since_epoch()).count());
+    extendedHeaderStream << duration_cast<microseconds>(system_clock::now().time_since_epoch()).count();
+    extendedHeaderStream << quint64(duration_cast<microseconds>(p_high_resolution_clock::now().time_since_epoch()).count()) - requestPacketReceiveTime;
     auto domainListPackets = NLPacketList::create(PacketType::DomainList, extendedHeader);
 
     // always send the node their own UUID back
diff --git a/libraries/networking/src/NodeList.cpp b/libraries/networking/src/NodeList.cpp
index ae2a495431..038d656dbb 100644
--- a/libraries/networking/src/NodeList.cpp
+++ b/libraries/networking/src/NodeList.cpp
@@ -416,7 +416,7 @@ void NodeList::sendDomainServerCheckIn() {
             packetStream << FingerprintUtils::getMachineFingerprint();
         }
 
-        packetStream << quint64(duration_cast<microseconds>(p_high_resolution_clock::now().time_since_epoch()).count());
+        packetStream << quint64(duration_cast<microseconds>(system_clock::now().time_since_epoch()).count());
 
         // pack our data to send to the domain-server including
         // the hostname information (so the domain-server can see which place name we came in on)
@@ -649,21 +649,20 @@ void NodeList::processDomainServerList(QSharedPointer<ReceivedMessage> message)
     bool isAuthenticated;
     packetStream >> isAuthenticated;
 
-    qint64 now = qint64(duration_cast<microseconds>(p_high_resolution_clock::now().time_since_epoch()).count());
+    qint64 now = qint64(duration_cast<microseconds>(system_clock::now().time_since_epoch()).count());
 
     quint64 connectRequestTimestamp;
     packetStream >> connectRequestTimestamp;
 
-    quint64 domainServerRequestReceiveTime;
-    packetStream >> domainServerRequestReceiveTime;
-
     quint64 domainServerPingSendTime;
     packetStream >> domainServerPingSendTime;
 
+    quint64 domainServerCheckinProcessingTime;
+    packetStream >> domainServerCheckinProcessingTime;
+
     qint64 pingLagTime = (now - qint64(connectRequestTimestamp)) / qint64(USECS_PER_MSEC);
 
-    qint64 domainServerRequestLag = (qint64(domainServerRequestReceiveTime) - qint64(connectRequestTimestamp)) / qint64(USECS_PER_MSEC);
-    quint64 domainServerCheckinProcessingTime = domainServerPingSendTime - domainServerRequestReceiveTime;
+    qint64 domainServerRequestLag = (qint64(domainServerPingSendTime - domainServerCheckinProcessingTime) - qint64(connectRequestTimestamp)) / qint64(USECS_PER_MSEC);;
     qint64 domainServerResponseLag = (now - qint64(domainServerPingSendTime)) / qint64(USECS_PER_MSEC);
 
     if (_domainHandler.getSockAddr().isNull()) {