From ce7802e5d5291c414883efbad93a9d165c03f40c Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Wed, 22 Jul 2015 02:12:37 +0200 Subject: [PATCH] Replace an assert with a small hack. Instead of checking that connect times are monotonic, explicitly make them so if they're not. This seems safest, in case the monotonic clock goes backwards a small bit (e.g. when changing CPUs). We don't need it for the serialized case since we explicitly sort those by time; the assert can stay. --- server.cpp | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/server.cpp b/server.cpp index 01ed0ff..079b629 100644 --- a/server.cpp +++ b/server.cpp @@ -217,9 +217,15 @@ void Server::add_client(int sock) assert(ret.second == true); // Should not already exist. Client *client_ptr = &ret.first->second; - // Connection timestamps must be nondecreasing. - assert(clients_ordered_by_connect_time.empty() || - !is_earlier(client_ptr->connect_time, clients_ordered_by_connect_time.back().first)); + // Connection timestamps must be nondecreasing. I can't find any guarantee + // that even the monotonic clock can't go backwards by a small amount + // (think switching between CPUs with non-synchronized TSCs), so if + // this actually should happen, we hack around it by fudging + // connect_time. + if (!clients_ordered_by_connect_time.empty() && + is_earlier(client_ptr->connect_time, clients_ordered_by_connect_time.back().first)) { + client_ptr->connect_time = clients_ordered_by_connect_time.back().first; + } clients_ordered_by_connect_time.push(make_pair(client_ptr->connect_time, sock)); // Start listening on data from this socket. -- 2.39.5