diff options
52 files changed, 265 insertions, 363 deletions
diff --git a/cpp/config/Make.rules.Linux b/cpp/config/Make.rules.Linux index 0e1ca24979a..196f1b889a4 100644 --- a/cpp/config/Make.rules.Linux +++ b/cpp/config/Make.rules.Linux @@ -83,7 +83,7 @@ ifeq ($(CXX),c++) lp64suffix = 64 endif - CXXFLAGS = $(CXXARCHFLAGS) -ftemplate-depth-128 -Wall -D_REENTRANT + CXXFLAGS = $(CXXARCHFLAGS) -ftemplate-depth-128 -Wall -D_REENTRANT -I/usr/include/nptl ifeq ($(STATICLIBS),) CXXFLAGS += -fPIC @@ -113,7 +113,7 @@ ifeq ($(CXX),c++) # CXXLIBS = - mkshlib = $(CXX) -shared $(LDFLAGS) -o $(1) -Wl,-h,$(2) $(3) $(4) -lpthread + mkshlib = $(CXX) -shared $(LDFLAGS) -o $(1) -Wl,-h,$(2) $(3) $(4) -lpthread -lrt mklib = ar cr $(1) $(2) @@ -151,7 +151,7 @@ ifeq ($(CXX),icpc) # CXXLIBS = - mkshlib = $(CXX) -shared $(LDFLAGS) -o $(1) -Wl,-h,$(2) $(3) $(4) -lpthread + mkshlib = $(CXX) -shared $(LDFLAGS) -o $(1) -Wl,-h,$(2) $(3) $(4) -lpthread -lrt mklib = ar cr $(1) $(2) @@ -159,7 +159,7 @@ ifeq ($(CXX),icpc) endif -BASELIBS = -lIceUtil $(STLPORT_LIBS) -lpthread +BASELIBS = -lIceUtil $(STLPORT_LIBS) -L/usr/lib/nptl -lpthread -lrt LIBS = $(BZIP2_RPATH_LINK) -lIce $(BASELIBS) ICEUTIL_OS_LIBS = diff --git a/cpp/demo/Freeze/bench/Client.cpp b/cpp/demo/Freeze/bench/Client.cpp index e1ec5b2014e..13a78073197 100644 --- a/cpp/demo/Freeze/bench/Client.cpp +++ b/cpp/demo/Freeze/bench/Client.cpp @@ -37,7 +37,7 @@ public: start() { _stopped = false; - _start = IceUtil::Time::now(); + _start = IceUtil::Time::now(IceUtil::Time::Monotonic); } IceUtil::Time @@ -46,7 +46,7 @@ public: if(!_stopped) { _stopped = true; - _stop = IceUtil::Time::now(); + _stop = IceUtil::Time::now(IceUtil::Time::Monotonic); } return _stop - _start; diff --git a/cpp/demo/Freeze/casino/BankI.cpp b/cpp/demo/Freeze/casino/BankI.cpp index e42cde83177..0050b844278 100644 --- a/cpp/demo/Freeze/casino/BankI.cpp +++ b/cpp/demo/Freeze/casino/BankI.cpp @@ -109,7 +109,7 @@ BankI::createBet(int amount, int lifetime, const Ice::Current&) Ice::Identity ident = { IceUtil::generateUUID(), "bet" }; #endif - Ice::Long closeTime = IceUtil::Time::now().toMilliSeconds() + lifetime; + Ice::Long closeTime = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds() + lifetime; outstandingChips += amount; Ice::ObjectPtr betI = new BetI(amount, closeTime, _prx, _betEvictor, _bankEdge); diff --git a/cpp/demo/Freeze/casino/Timer.cpp b/cpp/demo/Freeze/casino/Timer.cpp deleted file mode 100644 index 3e350032e97..00000000000 --- a/cpp/demo/Freeze/casino/Timer.cpp +++ /dev/null @@ -1,143 +0,0 @@ -// ********************************************************************** -// -// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. -// -// This copy of Ice is licensed to you under the terms described in the -// ICE_LICENSE file included in this distribution. -// -// ********************************************************************** - -#include <Timer.h> -#include <iostream> - -using namespace std; -using namespace IceUtil; - -Timer::Timer() : - _canceled(false) -{ - start(); -} - -void -Timer::cancel() -{ - bool join = false; - { - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor); - if(!_canceled) - { - _canceled = true; - join = true; - _monitor.notify(); - } - } - - if(join) - { - getThreadControl().join(); - } -} - - -void -Timer::schedule(const ::TimerTaskPtr& task, const IceUtil::Time& time) -{ -#if defined(_MSC_VER) && (_MSC_VER < 1300) - Entry entry; - entry.task = task; - entry.time = time; -#else - Entry entry = { task, time }; -#endif - - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor); - - // cout << "Scheduling task for " << time.toDateTime() << endl; - - bool notify = _queue.empty(); - - // - // Insert it at the proper position - // - bool inserted = false; - deque<Entry>::iterator p = _queue.begin(); - while(!inserted && p != _queue.end()) - { - if(time < p->time) - { - _queue.insert(p, entry); - inserted = true; - } - else - { - ++p; - } - } - - if(!inserted) - { - _queue.push_back(entry); - } - - if(notify) - { - _monitor.notify(); - } -} - -void -Timer::run() -{ - IceUtil::Monitor<IceUtil::Mutex>::Lock sync(_monitor); - - while(!_canceled) - { - while(!_canceled && _queue.empty()) - { - _monitor.wait(); // wait forever - } - - if(_canceled) - { - break; - } - - assert(!_queue.empty()); - - Entry entry = _queue.front(); - _queue.pop_front(); - - bool ready = false; - - do - { - IceUtil::Time now = IceUtil::Time::now(); - - ready = (entry.time <= now); - if(!ready) - { - // cout << "Waiting for " << (entry.time - now).toDuration() << endl; - - ready = (_monitor.timedWait(entry.time - now) == false); - } - } while(!_canceled && !ready); - - if(ready) - { - sync.release(); - - try - { - entry.task->run(); - } - catch(...) - { - cerr << "Task raised an exception" << endl; - // ignored - } - - sync.acquire(); - } - } -} diff --git a/cpp/demo/Freeze/casino/Timer.h b/cpp/demo/Freeze/casino/Timer.h deleted file mode 100644 index 95a2bf417dc..00000000000 --- a/cpp/demo/Freeze/casino/Timer.h +++ /dev/null @@ -1,57 +0,0 @@ -// ********************************************************************** -// -// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. -// -// This copy of Ice is licensed to you under the terms described in the -// ICE_LICENSE file included in this distribution. -// -// ********************************************************************** - -#ifndef CASINO_TIMER_H -#define CASINO_TIMER_H - -#include <IceUtil/IceUtil.h> -#include <deque> - -// -// A simplified version of java.util.Timer just for this demo -// - -class TimerTask : public IceUtil::Shared -{ -public: - - virtual void run() = 0; -}; - -typedef IceUtil::Handle<TimerTask> TimerTaskPtr; - -class Timer : public virtual IceUtil::Shared, private virtual IceUtil::Thread -{ -public: - - Timer(); - - void cancel(); - void schedule(const TimerTaskPtr&, const IceUtil::Time&); - -private: - - struct Entry - { - TimerTaskPtr task; - IceUtil::Time time; - }; - - virtual void run(); - - IceUtil::Monitor<IceUtil::Mutex> _monitor; - bool _canceled; - std::deque<Entry> _queue; - -}; - -typedef IceUtil::Handle<Timer> TimerPtr; - -#endif - diff --git a/cpp/demo/Freeze/customEvictor/Client.cpp b/cpp/demo/Freeze/customEvictor/Client.cpp index 66c3b804bdf..80bf2a11c76 100644 --- a/cpp/demo/Freeze/customEvictor/Client.cpp +++ b/cpp/demo/Freeze/customEvictor/Client.cpp @@ -48,7 +48,7 @@ public: // // Measures how long it takes to read 'readCount' items at random // - IceUtil::Time start = IceUtil::Time::now(); + IceUtil::Time start = IceUtil::Time::now(IceUtil::Time::Monotonic); try { @@ -64,7 +64,8 @@ public: ItemPrx item = ItemPrx::uncheckedCast(_anItem->ice_identity(identity)); item->getDescription(); } - _requestsPerSecond = static_cast<int>(readCount / (IceUtil::Time::now() - start).toSecondsDouble()); + _requestsPerSecond = + static_cast<int>(readCount / (IceUtil::Time::now(IceUtil::Time::Monotonic) - start).toSecondsDouble()); } catch(const IceUtil::Exception& e) { @@ -99,7 +100,7 @@ public: // // Measure how long it takes to write 'writeCount' items at random. // - IceUtil::Time start = IceUtil::Time::now(); + IceUtil::Time start = IceUtil::Time::now(IceUtil::Time::Monotonic); try { @@ -117,7 +118,8 @@ public: item->adjustStock(1); } - _requestsPerSecond = static_cast<int>(writeCount / (IceUtil::Time::now() - start).toSecondsDouble()); + _requestsPerSecond = + static_cast<int>(writeCount / (IceUtil::Time::now(IceUtil::Time::Monotonic) - start).toSecondsDouble()); } catch(const IceUtil::Exception& e) { diff --git a/cpp/demo/Ice/latency/Client.cpp b/cpp/demo/Ice/latency/Client.cpp index ce5cae636d1..686512b432e 100644 --- a/cpp/demo/Ice/latency/Client.cpp +++ b/cpp/demo/Ice/latency/Client.cpp @@ -47,7 +47,7 @@ LatencyClient::run(int argc, char* argv[]) // Initial ping to setup the connection. ping->ice_ping(); - IceUtil::Time tm = IceUtil::Time::now(); + IceUtil::Time tm = IceUtil::Time::now(IceUtil::Time::Monotonic); const int repetitions = 100000; cout << "pinging server " << repetitions << " times (this may take a while)" << endl; @@ -56,7 +56,7 @@ LatencyClient::run(int argc, char* argv[]) ping->ice_ping(); } - tm = IceUtil::Time::now() - tm; + tm = IceUtil::Time::now(IceUtil::Time::Monotonic) - tm; cout << "time for " << repetitions << " pings: " << tm * 1000 << "ms" << endl; cout << "time per ping: " << tm * 1000 / repetitions << "ms" << endl; diff --git a/cpp/demo/Ice/session/ReapThread.cpp b/cpp/demo/Ice/session/ReapThread.cpp index 0676f5c8b91..36845dcd183 100755 --- a/cpp/demo/Ice/session/ReapThread.cpp +++ b/cpp/demo/Ice/session/ReapThread.cpp @@ -39,7 +39,7 @@ ReapThread::run() // real-world example. Therefore the current time // is computed for each iteration. // - if((IceUtil::Time::now() - p->session->timestamp()) > _timeout) + if((IceUtil::Time::now(IceUtil::Time::Monotonic) - p->session->timestamp()) > _timeout) { string name = p->proxy->getName(); p->proxy->destroy(); diff --git a/cpp/demo/Ice/session/SessionI.cpp b/cpp/demo/Ice/session/SessionI.cpp index a0e70e24168..14e03c8b096 100755 --- a/cpp/demo/Ice/session/SessionI.cpp +++ b/cpp/demo/Ice/session/SessionI.cpp @@ -42,7 +42,7 @@ private: SessionI::SessionI(const string& name) : _name(name), - _timestamp(IceUtil::Time::now()), + _timestamp(IceUtil::Time::now(IceUtil::Time::Monotonic)), _nextId(0), _destroy(false) { @@ -72,7 +72,7 @@ SessionI::refresh(const Ice::Current& c) throw Ice::ObjectNotExistException(__FILE__, __LINE__); } - _timestamp = IceUtil::Time::now(); + _timestamp = IceUtil::Time::now(IceUtil::Time::Monotonic); } string diff --git a/cpp/demo/Ice/throughput/Client.cpp b/cpp/demo/Ice/throughput/Client.cpp index 82a3e621e69..6bbf4e22f7d 100644 --- a/cpp/demo/Ice/throughput/Client.cpp +++ b/cpp/demo/Ice/throughput/Client.cpp @@ -152,7 +152,7 @@ ThroughputClient::run(int argc, char* argv[]) cout << "==> "; cin >> c; - IceUtil::Time tm = IceUtil::Time::now(); + IceUtil::Time tm = IceUtil::Time::now(IceUtil::Time::Monotonic); const int repetitions = 1000; if(c == '1' || c == '2' || c == '3' || c == '4') @@ -379,7 +379,7 @@ ThroughputClient::run(int argc, char* argv[]) } } - tm = IceUtil::Time::now() - tm; + tm = IceUtil::Time::now(IceUtil::Time::Monotonic) - tm; cout << "time for " << repetitions << " sequences: " << tm * 1000 << "ms" << endl; cout << "time per sequence: " << tm * 1000 / repetitions << "ms" << endl; int wireSize = 0; diff --git a/cpp/demo/IcePatch2/MFC/PatchClientDlg.cpp b/cpp/demo/IcePatch2/MFC/PatchClientDlg.cpp index 5f8d6f61acf..0453190293f 100755 --- a/cpp/demo/IcePatch2/MFC/PatchClientDlg.cpp +++ b/cpp/demo/IcePatch2/MFC/PatchClientDlg.cpp @@ -181,7 +181,7 @@ CPatchDlg::patchStart(const string& path, Ice::Long size, Ice::Long totalProgres { if(!_isPatch) { - _startTime = IceUtil::Time::now(); + _startTime = IceUtil::Time::now(IceUtil::Time::Monotonic); _status->SetWindowText(CString(L" Patching...")); _speed->SetWindowText(CString(L" 0.0 KB/s")); _isPatch = true; @@ -197,7 +197,7 @@ CPatchDlg::patchStart(const string& path, Ice::Long size, Ice::Long totalProgres bool CPatchDlg::patchProgress(Ice::Long, Ice::Long, Ice::Long totalProgress, Ice::Long totalSize) { - IceUtil::Time elapsed = IceUtil::Time::now() - _startTime; + IceUtil::Time elapsed = IceUtil::Time::now(IceUtil::Time::Monotonic) - _startTime; if(elapsed.toSeconds() > 0) { CString speed; diff --git a/cpp/include/IceUtil/Cond.h b/cpp/include/IceUtil/Cond.h index f7b192c300d..dde7d3082a0 100644 --- a/cpp/include/IceUtil/Cond.h +++ b/cpp/include/IceUtil/Cond.h @@ -223,7 +223,7 @@ Cond::timedWaitImpl(const M& mutex, const Time& timeout) const LockState state; mutex.unlock(state); - timeval tv = Time::now() + timeout; + timeval tv = Time::now(Time::Monotonic) + timeout; timespec ts; ts.tv_sec = tv.tv_sec; ts.tv_nsec = tv.tv_usec * 1000; diff --git a/cpp/include/IceUtil/Time.h b/cpp/include/IceUtil/Time.h index b2b5981776a..60e87501031 100644 --- a/cpp/include/IceUtil/Time.h +++ b/cpp/include/IceUtil/Time.h @@ -29,7 +29,8 @@ public: // automatically generated copy constructor and assignment // operator do the right thing. - static Time now(); + enum Clock { Realtime, Monotonic }; + static Time now(Clock = Realtime); static Time seconds(Int64); static Time milliSeconds(Int64); static Time microSeconds(Int64); @@ -194,6 +195,9 @@ private: Time(Int64); Int64 _usec; +#ifdef _WIN32 + static Int64 _frequency; +#endif }; ICE_UTIL_API std::ostream& operator<<(std::ostream&, const Time&); diff --git a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp index 0b0273fe2c5..c8a73975f11 100644 --- a/cpp/src/Freeze/BackgroundSaveEvictorI.cpp +++ b/cpp/src/Freeze/BackgroundSaveEvictorI.cpp @@ -269,7 +269,7 @@ Freeze::BackgroundSaveEvictorI::addFacet(const ObjectPtr& servant, const Identit ObjectRecord& rec = element->rec; rec.servant = servant; - rec.stats.creationTime = IceUtil::Time::now().toMilliSeconds(); + rec.stats.creationTime = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); rec.stats.lastSaveTime = 0; rec.stats.avgSaveTime = 0; @@ -901,7 +901,7 @@ Freeze::BackgroundSaveEvictorI::run() deque<StreamedObject> streamedObjectQueue; - Long streamStart = IceUtil::Time::now().toMilliSeconds(); + Long streamStart = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); // // Stream each element @@ -1051,7 +1051,7 @@ Freeze::BackgroundSaveEvictorI::run() if(_trace >= 1) { - Long now = IceUtil::Time::now().toMilliSeconds(); + Long now = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); Trace out(_communicator->getLogger(), "Freeze.Evictor"); out << "streamed " << streamedObjectQueue.size() << " objects in " << static_cast<Int>(now - streamStart) << " ms"; @@ -1083,7 +1083,7 @@ Freeze::BackgroundSaveEvictorI::run() txSize = streamedObjectQueue.size(); } - Long saveStart = IceUtil::Time::now().toMilliSeconds(); + Long saveStart = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); try { DbTxn* tx = 0; @@ -1129,7 +1129,7 @@ Freeze::BackgroundSaveEvictorI::run() if(_trace >= 1) { - Long now = IceUtil::Time::now().toMilliSeconds(); + Long now = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); Trace out(_communicator->getLogger(), "Freeze.Evictor"); out << "saved " << txSize << " objects in " << static_cast<Int>(now - saveStart) << " ms"; diff --git a/cpp/src/Freeze/TransactionalEvictorContext.cpp b/cpp/src/Freeze/TransactionalEvictorContext.cpp index 9fe1cf11d3f..369c6fd1763 100644 --- a/cpp/src/Freeze/TransactionalEvictorContext.cpp +++ b/cpp/src/Freeze/TransactionalEvictorContext.cpp @@ -223,7 +223,8 @@ Freeze::TransactionalEvictorContext::ServantHolder::~ServantHolder() { if(!_body.readOnly && !_body.removed) { - EvictorIBase::updateStats(_body.rec.stats, IceUtil::Time::now().toMilliSeconds()); + EvictorIBase::updateStats(_body.rec.stats, + IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds()); _body.store->update(_body.current->id, _body.rec, ctx->_tx); } diff --git a/cpp/src/Freeze/TransactionalEvictorI.cpp b/cpp/src/Freeze/TransactionalEvictorI.cpp index eb359c22368..5ce3ed9dab6 100644 --- a/cpp/src/Freeze/TransactionalEvictorI.cpp +++ b/cpp/src/Freeze/TransactionalEvictorI.cpp @@ -138,7 +138,7 @@ Freeze::TransactionalEvictorI::addFacet(const ObjectPtr& servant, const Identity checkIdentity(ident); DeactivateController::Guard deactivateGuard(_deactivateController); - Ice::Long currentTime = IceUtil::Time::now().toMilliSeconds(); + Ice::Long currentTime = IceUtil::Time::now(IceUtil::Time::Monotonic).toMilliSeconds(); Statistics stats = { currentTime }; ObjectRecord rec; diff --git a/cpp/src/Glacier2/RequestQueue.cpp b/cpp/src/Glacier2/RequestQueue.cpp index 099b73f3640..399884cf2f2 100644 --- a/cpp/src/Glacier2/RequestQueue.cpp +++ b/cpp/src/Glacier2/RequestQueue.cpp @@ -352,14 +352,14 @@ Glacier2::RequestQueue::run() { if(_sleep) { - IceUtil::Time now = IceUtil::Time::now(); + IceUtil::Time now = IceUtil::Time::now(IceUtil::Time::Monotonic); if(!timedWait(_sleepDuration)) { _sleepDuration = IceUtil::Time(); } else { - _sleepDuration -= IceUtil::Time::now() - now; + _sleepDuration -= IceUtil::Time::now(IceUtil::Time::Monotonic) - now; } if(_sleepDuration <= IceUtil::Time()) { diff --git a/cpp/src/Glacier2/RouterI.cpp b/cpp/src/Glacier2/RouterI.cpp index ff917e8b445..ee6dde8edd4 100644 --- a/cpp/src/Glacier2/RouterI.cpp +++ b/cpp/src/Glacier2/RouterI.cpp @@ -30,7 +30,7 @@ Glacier2::RouterI::RouterI(const ObjectAdapterPtr& clientAdapter, const ObjectAd _session(session), _controlId(controlId), _sslContext(sslContext), - _timestamp(IceUtil::Time::now()) + _timestamp(IceUtil::Time::now(IceUtil::Time::Monotonic)) { // // If Glacier2 will be used with pre 3.2 clients, then the client proxy must be set. @@ -142,7 +142,7 @@ Glacier2::RouterI::addProxies(const ObjectProxySeq& proxies, const Current& curr { IceUtil::Mutex::Lock lock(*this); - _timestamp = IceUtil::Time::now(); + _timestamp = IceUtil::Time::now(IceUtil::Time::Monotonic); return _clientBlobject->add(proxies, current); } @@ -186,7 +186,7 @@ Glacier2::RouterI::getClientBlobject() const { IceUtil::Mutex::Lock lock(*this); - _timestamp = IceUtil::Time::now(); + _timestamp = IceUtil::Time::now(IceUtil::Time::Monotonic); return _clientBlobject; } @@ -219,7 +219,7 @@ Glacier2::RouterI::getTimestamp() const } else { - return IceUtil::Time::now(); + return IceUtil::Time::now(IceUtil::Time::Monotonic); } } diff --git a/cpp/src/Glacier2/SessionRouterI.cpp b/cpp/src/Glacier2/SessionRouterI.cpp index 642f4f527f7..95945659800 100644 --- a/cpp/src/Glacier2/SessionRouterI.cpp +++ b/cpp/src/Glacier2/SessionRouterI.cpp @@ -641,7 +641,7 @@ Glacier2::SessionRouterI::expireSessions() } assert(_sessionTimeout > IceUtil::Time()); - IceUtil::Time minTimestamp = IceUtil::Time::now() - _sessionTimeout; + IceUtil::Time minTimestamp = IceUtil::Time::now(IceUtil::Time::Monotonic) - _sessionTimeout; map<ConnectionPtr, RouterIPtr>::iterator p = _routersByConnection.begin(); diff --git a/cpp/src/Ice/ConnectionI.cpp b/cpp/src/Ice/ConnectionI.cpp index 69d8d52206b..cdf3dce6b80 100644 --- a/cpp/src/Ice/ConnectionI.cpp +++ b/cpp/src/Ice/ConnectionI.cpp @@ -216,7 +216,7 @@ Ice::ConnectionI::validate() if(_acmTimeout > 0) { - _acmAbsoluteTimeout = IceUtil::Time::now() + IceUtil::Time::seconds(_acmTimeout); + _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout); } // @@ -407,7 +407,7 @@ Ice::ConnectionI::waitUntilFinished() if(_state != StateClosed && _endpoint->timeout() >= 0) { IceUtil::Time timeout = IceUtil::Time::milliSeconds(_endpoint->timeout()); - IceUtil::Time waitTime = _stateTime + timeout - IceUtil::Time::now(); + IceUtil::Time waitTime = _stateTime + timeout - IceUtil::Time::now(IceUtil::Time::Monotonic); if(waitTime > IceUtil::Time()) { @@ -477,7 +477,7 @@ Ice::ConnectionI::monitor() // for(map<Int, AsyncRequest>::iterator p = _asyncRequests.begin(); p != _asyncRequests.end(); ++p) { - if(p->second.t > IceUtil::Time() && p->second.t <= IceUtil::Time::now()) + if(p->second.t > IceUtil::Time() && p->second.t <= IceUtil::Time::now(IceUtil::Time::Monotonic)) { setState(StateClosed, TimeoutException(__FILE__, __LINE__)); return; @@ -492,7 +492,7 @@ Ice::ConnectionI::monitor() !_batchStreamInUse && _batchStream.b.empty() && _dispatchCount == 0) { - if(IceUtil::Time::now() >= _acmAbsoluteTimeout) + if(IceUtil::Time::now(IceUtil::Time::Monotonic) >= _acmAbsoluteTimeout) { setState(StateClosing, ConnectionTimeoutException(__FILE__, __LINE__)); return; @@ -556,7 +556,7 @@ Ice::ConnectionI::sendRequest(BasicStream* os, Outgoing* out, bool compress) if(_acmTimeout > 0) { - _acmAbsoluteTimeout = IceUtil::Time::now() + IceUtil::Time::seconds(_acmTimeout); + _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout); } } @@ -715,14 +715,15 @@ Ice::ConnectionI::sendAsyncRequest(BasicStream* os, const OutgoingAsyncPtr& out, asyncRequest.p = out; if(_endpoint->timeout() > 0) { - asyncRequest.t = IceUtil::Time::now() + IceUtil::Time::milliSeconds(_endpoint->timeout()); + asyncRequest.t = + IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::milliSeconds(_endpoint->timeout()); } _asyncRequestsHint = _asyncRequests.insert(_asyncRequests.end(), pair<const Int, AsyncRequest>(requestId, asyncRequest)); if(_acmTimeout > 0) { - _acmAbsoluteTimeout = IceUtil::Time::now() + IceUtil::Time::seconds(_acmTimeout); + _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout); } } @@ -1037,7 +1038,7 @@ Ice::ConnectionI::flushBatchRequestsInternal(bool ignoreInUse) if(_acmTimeout > 0) { - _acmAbsoluteTimeout = IceUtil::Time::now() + IceUtil::Time::seconds(_acmTimeout); + _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout); } // @@ -1253,7 +1254,8 @@ Ice::ConnectionI::sendResponse(BasicStream* os, Byte compressFlag) if(_acmTimeout > 0) { - _acmAbsoluteTimeout = IceUtil::Time::now() + IceUtil::Time::seconds(_acmTimeout); + _acmAbsoluteTimeout = + IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout); } } catch(const LocalException& ex) @@ -1596,7 +1598,7 @@ Ice::ConnectionI::ConnectionI(const InstancePtr& instance, _batchMarker(0), _dispatchCount(0), _state(StateNotValidated), - _stateTime(IceUtil::Time::now()) + _stateTime(IceUtil::Time::now(IceUtil::Time::Monotonic)) { Int& acmTimeout = const_cast<Int&>(_acmTimeout); if(_endpoint->datagram()) @@ -1944,7 +1946,7 @@ Ice::ConnectionI::setState(State state) } _state = state; - _stateTime = IceUtil::Time::now(); + _stateTime = IceUtil::Time::now(IceUtil::Time::Monotonic); notifyAll(); @@ -2184,7 +2186,7 @@ Ice::ConnectionI::parseMessage(BasicStream& stream, Int& invokeNum, Int& request if(_acmTimeout > 0) { - _acmAbsoluteTimeout = IceUtil::Time::now() + IceUtil::Time::seconds(_acmTimeout); + _acmAbsoluteTimeout = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_acmTimeout); } try diff --git a/cpp/src/Ice/GC.cpp b/cpp/src/Ice/GC.cpp index 605997439a5..80fab03aa3f 100755 --- a/cpp/src/Ice/GC.cpp +++ b/cpp/src/Ice/GC.cpp @@ -268,7 +268,7 @@ IceInternal::GC::collectGarbage() if(_statsCallback) { - t = Time::now(); + t = Time::now(IceUtil::Time::Monotonic); stats.examined = static_cast<int>(gcObjects.size()); } @@ -367,7 +367,7 @@ IceInternal::GC::collectGarbage() if(_statsCallback) { - stats.time = Time::now() - t; + stats.time = Time::now(IceUtil::Time::Monotonic) - t; stats.collected = static_cast<int>(counts.size()); _statsCallback(stats); } diff --git a/cpp/src/Ice/LocatorInfo.cpp b/cpp/src/Ice/LocatorInfo.cpp index b7a99ba1cb4..606d7557fdd 100644 --- a/cpp/src/Ice/LocatorInfo.cpp +++ b/cpp/src/Ice/LocatorInfo.cpp @@ -144,11 +144,12 @@ IceInternal::LocatorTable::addAdapterEndpoints(const string& adapter, const vect if(p != _adapterEndpointsMap.end()) { - p->second = make_pair(IceUtil::Time::now(), endpoints); + p->second = make_pair(IceUtil::Time::now(IceUtil::Time::Monotonic), endpoints); } else { - _adapterEndpointsMap.insert(make_pair(adapter, make_pair(IceUtil::Time::now(), endpoints))); + _adapterEndpointsMap.insert( + make_pair(adapter, make_pair(IceUtil::Time::now(IceUtil::Time::Monotonic), endpoints))); } } @@ -199,11 +200,11 @@ IceInternal::LocatorTable::addProxy(const Identity& id, const ObjectPrx& proxy) if(p != _objectMap.end()) { - p->second = make_pair(IceUtil::Time::now(), proxy); + p->second = make_pair(IceUtil::Time::now(IceUtil::Time::Monotonic), proxy); } else { - _objectMap.insert(make_pair(id, make_pair(IceUtil::Time::now(), proxy))); + _objectMap.insert(make_pair(id, make_pair(IceUtil::Time::now(IceUtil::Time::Monotonic), proxy))); } } @@ -233,7 +234,7 @@ IceInternal::LocatorTable::checkTTL(const IceUtil::Time& time, int ttl) const } else { - return IceUtil::Time::now() - time <= IceUtil::Time::seconds(ttl); + return IceUtil::Time::now(IceUtil::Time::Monotonic) - time <= IceUtil::Time::seconds(ttl); } } diff --git a/cpp/src/IceGrid/Allocatable.cpp b/cpp/src/IceGrid/Allocatable.cpp index bcf1e5b17ef..05f48d70311 100644 --- a/cpp/src/IceGrid/Allocatable.cpp +++ b/cpp/src/IceGrid/Allocatable.cpp @@ -38,7 +38,8 @@ AllocationRequest::pending() if(_timeout > 0) { - _session->getTimer()->schedule(this, IceUtil::Time::now() + IceUtil::Time::milliSeconds(_timeout)); + _session->getTimer()->schedule(this, IceUtil::Time::now(IceUtil::Time::Monotonic) + + IceUtil::Time::milliSeconds(_timeout)); } _state = Pending; return true; diff --git a/cpp/src/IceGrid/NodeSessionI.cpp b/cpp/src/IceGrid/NodeSessionI.cpp index 6d12869379e..49a46ef1959 100644 --- a/cpp/src/IceGrid/NodeSessionI.cpp +++ b/cpp/src/IceGrid/NodeSessionI.cpp @@ -141,7 +141,7 @@ NodeSessionI::NodeSessionI(const DatabasePtr& database, _node(node), _info(info), _timeout(timeout), - _timestamp(IceUtil::Time::now()), + _timestamp(IceUtil::Time::now(IceUtil::Time::Monotonic)), _load(load), _destroy(false) { @@ -189,7 +189,7 @@ NodeSessionI::keepAlive(const LoadInfo& load, const Ice::Current& current) throw Ice::ObjectNotExistException(__FILE__, __LINE__); } - _timestamp = IceUtil::Time::now(); + _timestamp = IceUtil::Time::now(IceUtil::Time::Monotonic); _load = load; if(_traceLevels->node > 2) diff --git a/cpp/src/IceGrid/ReapThread.cpp b/cpp/src/IceGrid/ReapThread.cpp index 06869232b6e..9034a6f18f8 100644 --- a/cpp/src/IceGrid/ReapThread.cpp +++ b/cpp/src/IceGrid/ReapThread.cpp @@ -57,7 +57,7 @@ ReapThread::run() { try { - if((IceUtil::Time::now() - p->item->timestamp()) > p->timeout) + if((IceUtil::Time::now(IceUtil::Time::Monotonic) - p->item->timestamp()) > p->timeout) { reap.push_back(*p); p = _sessions.erase(p); diff --git a/cpp/src/IceGrid/ReplicaSessionI.cpp b/cpp/src/IceGrid/ReplicaSessionI.cpp index 6de154a0ee5..110e9b6d46e 100644 --- a/cpp/src/IceGrid/ReplicaSessionI.cpp +++ b/cpp/src/IceGrid/ReplicaSessionI.cpp @@ -39,7 +39,7 @@ ReplicaSessionI::ReplicaSessionI(const DatabasePtr& database, _internalRegistry(proxy), _info(info), _timeout(timeout), - _timestamp(IceUtil::Time::now()), + _timestamp(IceUtil::Time::now(IceUtil::Time::Monotonic)), _destroy(false) { __setNoDelete(true); @@ -79,7 +79,7 @@ ReplicaSessionI::keepAlive(const Ice::Current& current) throw Ice::ObjectNotExistException(__FILE__, __LINE__); } - _timestamp = IceUtil::Time::now(); + _timestamp = IceUtil::Time::now(IceUtil::Time::Monotonic); if(_traceLevels->replica > 2) { diff --git a/cpp/src/IceGrid/ServerI.cpp b/cpp/src/IceGrid/ServerI.cpp index 5e4a03e02cb..0ec35344f6e 100644 --- a/cpp/src/IceGrid/ServerI.cpp +++ b/cpp/src/IceGrid/ServerI.cpp @@ -346,7 +346,7 @@ void TimedServerCommand::startTimer() { _timerTask = new CommandTimeoutTimerTask(this); - _timer->schedule(_timerTask, IceUtil::Time::now() + IceUtil::Time::seconds(_timeout)); + _timer->schedule(_timerTask, IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(_timeout)); } void @@ -654,7 +654,7 @@ ServerI::ServerI(const NodeIPtr& node, const ServerPrx& proxy, const string& ser _disableOnFailure(0), _state(ServerI::Inactive), _activation(ServerI::Disabled), - _failureTime(IceUtil::Time::now()), // Ensure that _activation gets initialized in updateImpl(). + _failureTime(IceUtil::Time::now(IceUtil::Time::Monotonic)), // Ensure that _activation gets initialized in updateImpl(). _pid(0) { assert(_node->getActivator()); @@ -895,7 +895,8 @@ ServerI::start(ServerActivation activation, const AMD_Server_startPtr& amdCB) if(_disableOnFailure > 0 && _failureTime != IceUtil::Time()) { if(activation == Manual || - (_failureTime + IceUtil::Time::seconds(_disableOnFailure) < IceUtil::Time::now())) + (_failureTime + IceUtil::Time::seconds(_disableOnFailure) < + IceUtil::Time::now(IceUtil::Time::Monotonic))) { _activation = _previousActivation; _failureTime = IceUtil::Time(); @@ -1197,7 +1198,7 @@ ServerI::disableOnFailure() { _previousActivation = _activation; _activation = Disabled; - _failureTime = IceUtil::Time::now(); + _failureTime = IceUtil::Time::now(IceUtil::Time::Monotonic); } } @@ -1210,7 +1211,8 @@ ServerI::enableAfterFailure(bool force) } if(force || - _disableOnFailure > 0 && (_failureTime + IceUtil::Time::seconds(_disableOnFailure) < IceUtil::Time::now())) + _disableOnFailure > 0 && + (_failureTime + IceUtil::Time::seconds(_disableOnFailure) < IceUtil::Time::now(IceUtil::Time::Monotonic))) { _activation = _previousActivation; _failureTime = IceUtil::Time(); @@ -2451,7 +2453,8 @@ ServerI::setStateNoSync(InternalServerState st, const std::string& reason) if(_activation == Always) { _timerTask = new DelayedStart(this, _node->getTraceLevels()); - _node->getTimer()->schedule(_timerTask, IceUtil::Time::now() + IceUtil::Time::milliSeconds(500)); + _node->getTimer()->schedule(_timerTask, IceUtil::Time::now(IceUtil::Time::Monotonic) + + IceUtil::Time::milliSeconds(500)); } else if(_activation == Disabled && _disableOnFailure > 0 && _failureTime != IceUtil::Time()) { @@ -2463,8 +2466,8 @@ ServerI::setStateNoSync(InternalServerState st, const std::string& reason) // callback is executed. // _timerTask = new DelayedStart(this, _node->getTraceLevels()); - _node->getTimer()->schedule(_timerTask, IceUtil::Time::now() + IceUtil::Time::seconds(_disableOnFailure) + - IceUtil::Time::milliSeconds(500)); + _node->getTimer()->schedule(_timerTask, IceUtil::Time::now(IceUtil::Time::Monotonic) + + IceUtil::Time::seconds(_disableOnFailure) + IceUtil::Time::milliSeconds(500)); } } diff --git a/cpp/src/IceGrid/SessionI.cpp b/cpp/src/IceGrid/SessionI.cpp index 694ed50bff5..44241b8697b 100644 --- a/cpp/src/IceGrid/SessionI.cpp +++ b/cpp/src/IceGrid/SessionI.cpp @@ -74,7 +74,7 @@ BaseSessionI::BaseSessionI(const string& id, _database(database), _filters(filters), _destroyed(false), - _timestamp(IceUtil::Time::now()) + _timestamp(IceUtil::Time::now(IceUtil::Time::Monotonic)) { if(_traceLevels && _traceLevels->session > 0) { @@ -98,7 +98,7 @@ BaseSessionI::keepAlive(const Ice::Current& current) throw ex; } - _timestamp = IceUtil::Time::now(); + _timestamp = IceUtil::Time::now(IceUtil::Time::Monotonic); if(_traceLevels->session > 1) { diff --git a/cpp/src/IceGrid/WaitQueue.cpp b/cpp/src/IceGrid/WaitQueue.cpp index 06e18766558..93c294d0018 100644 --- a/cpp/src/IceGrid/WaitQueue.cpp +++ b/cpp/src/IceGrid/WaitQueue.cpp @@ -61,7 +61,7 @@ WaitQueue::run() while(!_waitQueue.empty() && !_destroyed) { WaitItemPtr item = _waitQueue.front(); - if(item->getExpirationTime() <= IceUtil::Time::now()) + if(item->getExpirationTime() <= IceUtil::Time::now(IceUtil::Time::Monotonic)) { expired.push_back(item); _waitQueue.pop_front(); @@ -76,7 +76,7 @@ WaitQueue::run() // Wait until the next item expire or a notification. Note: in any case we // get out of this loop to get a chance to execute the work queue. // - timedWait(item->getExpirationTime() - IceUtil::Time::now()); + timedWait(item->getExpirationTime() - IceUtil::Time::now(IceUtil::Time::Monotonic)); } } } @@ -140,7 +140,7 @@ WaitQueue::add(const WaitItemPtr& item, const IceUtil::Time& wait) // bool notifyThread = _waitQueue.empty(); - IceUtil::Time expire = IceUtil::Time::now() + wait; + IceUtil::Time expire = IceUtil::Time::now(IceUtil::Time::Monotonic) + wait; item->setExpirationTime(expire); list<WaitItemPtr>::iterator p = _waitQueue.begin(); diff --git a/cpp/src/IceStorm/Subscriber.cpp b/cpp/src/IceStorm/Subscriber.cpp index 7eab249578e..b7e5ef45aa9 100644 --- a/cpp/src/IceStorm/Subscriber.cpp +++ b/cpp/src/IceStorm/Subscriber.cpp @@ -613,7 +613,7 @@ SubscriberLink::queue(bool forwarded, const EventDataSeq& events) // forwarded argument an EventInfo thing where the queue-time // is lazy initialized. // - if(IceUtil::Time::now() < _next) + if(IceUtil::Time::now(IceUtil::Time::Monotonic) < _next) { return QueueStateNoFlush; } @@ -713,7 +713,7 @@ SubscriberLink::offline(const Ice::Exception& e) IceUtil::Mutex::Lock sync(_mutex); assert(_state != SubscriberStateOffline); - _next = IceUtil::Time::now() + _instance->discardInterval(); + _next = IceUtil::Time::now(IceUtil::Time::Monotonic) + _instance->discardInterval(); TraceLevelsPtr traceLevels = _instance->traceLevels(); if(_warn) diff --git a/cpp/src/IceStorm/SubscriberPool.cpp b/cpp/src/IceStorm/SubscriberPool.cpp index 8fcbb75d4b1..254b99b4ae6 100644 --- a/cpp/src/IceStorm/SubscriberPool.cpp +++ b/cpp/src/IceStorm/SubscriberPool.cpp @@ -58,9 +58,9 @@ public: // if(computeInterval) { - IceUtil::Time start = IceUtil::Time::now(); + IceUtil::Time start = IceUtil::Time::now(IceUtil::Time::Monotonic); requeue = sub->flush(); - interval = IceUtil::Time::now() - start; + interval = IceUtil::Time::now(IceUtil::Time::Monotonic) - start; } else { @@ -350,7 +350,7 @@ SubscriberPool::dequeue(SubscriberPtr& subscriber, bool requeue, const IceUtil:: // if(_workers.size() > _size) { - IceUtil::Time now = IceUtil::Time::now(); + IceUtil::Time now = IceUtil::Time::now(IceUtil::Time::Monotonic); if(now - _lastStallCheck > _stallCheck) { _lastStallCheck = now; @@ -398,7 +398,7 @@ SubscriberPool::dequeue(SubscriberPtr& subscriber, bool requeue, const IceUtil:: return; } - _lastDequeue = IceUtil::Time::now(); + _lastDequeue = IceUtil::Time::now(IceUtil::Time::Monotonic); subscriber = _pending.front(); _pending.pop_front(); @@ -475,7 +475,7 @@ SubscriberPool::check() return; } - IceUtil::Time now = IceUtil::Time::now(); + IceUtil::Time now = IceUtil::Time::now(IceUtil::Time::Monotonic); IceUtil::Time interval = now - _lastDequeue; /* if(_traceLevels->subscriberPool > 1) diff --git a/cpp/src/IceUtil/Cond.cpp b/cpp/src/IceUtil/Cond.cpp index f53d338191c..f1c24099eb8 100644 --- a/cpp/src/IceUtil/Cond.cpp +++ b/cpp/src/IceUtil/Cond.cpp @@ -302,6 +302,14 @@ IceUtil::Cond::Cond() throw ThreadSyscallException(__FILE__, __LINE__, rc); } +#if !defined(__hpux) && !defined(__APPLE__) + rc = pthread_condattr_setclock(&attr, CLOCK_MONOTONIC); + if(rc != 0) + { + throw ThreadSyscallException(__FILE__, __LINE__, rc); + } +#endif + rc = pthread_cond_init(&_cond, &attr); if(rc != 0) { diff --git a/cpp/src/IceUtil/RWRecMutex.cpp b/cpp/src/IceUtil/RWRecMutex.cpp index d15d4acd98c..8f07a0dc1f0 100644 --- a/cpp/src/IceUtil/RWRecMutex.cpp +++ b/cpp/src/IceUtil/RWRecMutex.cpp @@ -89,10 +89,10 @@ IceUtil::RWRecMutex::timedReadLock(const Time& timeout) const // Wait while a writer holds the lock or while writers or an upgrader // are waiting to get the lock. // - Time end = Time::now() + timeout; + Time end = Time::now(Time::Monotonic) + timeout; while(_count < 0 || _waitingWriters != 0) { - Time remainder = end - Time::now(); + Time remainder = end - Time::now(Time::Monotonic); if(remainder > Time()) { if(_readers.timedWait(lock, remainder) == false) @@ -200,10 +200,10 @@ IceUtil::RWRecMutex::timedWriteLock(const Time& timeout) const // Wait for the lock to become available and increment the number // of waiting writers. // - Time end = Time::now() + timeout; + Time end = Time::now(Time::Monotonic) + timeout; while(_count != 0) { - Time remainder = end - Time::now(); + Time remainder = end - Time::now(Time::Monotonic); if(remainder > Time()) { ++_waitingWriters; @@ -382,10 +382,10 @@ IceUtil::RWRecMutex::timedUpgrade(const Time& timeout) const // Wait to acquire the write lock. // _upgrading = true; - Time end = Time::now() + timeout; + Time end = Time::now(Time::Monotonic) + timeout; while(_count != 0) { - Time remainder = end - Time::now(); + Time remainder = end - Time::now(Time::Monotonic); if(remainder > Time()) { ++_waitingWriters; diff --git a/cpp/src/IceUtil/Time.cpp b/cpp/src/IceUtil/Time.cpp index c39c2bcf53e..d562d7a72b4 100644 --- a/cpp/src/IceUtil/Time.cpp +++ b/cpp/src/IceUtil/Time.cpp @@ -25,24 +25,58 @@ Time::Time() : { } +#ifdef _WIN32 +Int64 IceUtil::Time::_frequency = -1; +#endif + Time -IceUtil::Time::now() +IceUtil::Time::now(Clock clock) { + if(clock == Realtime) + { #ifdef _WIN32 # if defined(_MSC_VER) - struct _timeb tb; - _ftime(&tb); + struct _timeb tb; + _ftime(&tb); # elif defined(__BCPLUSPLUS__) - struct timeb tb; - ftime(&tb); + struct timeb tb; + ftime(&tb); # endif - return Time(static_cast<Int64>(tb.time) * ICE_INT64(1000000) + - tb.millitm * 1000); + return Time(static_cast<Int64>(tb.time) * ICE_INT64(1000000) + + tb.millitm * 1000); #else - struct timeval tv; - gettimeofday(&tv, 0); - return Time(tv.tv_sec * ICE_INT64(1000000) + tv.tv_usec); + struct timeval tv; + gettimeofday(&tv, 0); + return Time(tv.tv_sec * ICE_INT64(1000000) + tv.tv_usec); #endif + } + else // Monotonic + { +#if defined(_WIN32) + if(_frequency == -1) + { + // + // Frequency cannot change while machine is running so it + // only needs to be retrieved once. + // + QueryPerformanceFrequency((LARGE_INTEGER*)&_frequency); + } + Int64 count; + QueryPerformanceCounter((LARGE_INTEGER*)&count); + return Time((Int64)(1000000.0 / _frequency * count)); +#elif defined(__hpux) || defined(__APPLE__) + // + // HP/MacOS does not support CLOCK_MONOTONIC + // + struct timeval tv; + gettimeofday(&tv, 0); + return Time(tv.tv_sec * ICE_INT64(1000000) + tv.tv_usec); +#else + struct timespec ts; + clock_gettime(CLOCK_MONOTONIC, &ts); + return Time(ts.tv_sec * ICE_INT64(1000000) + ts.tv_nsec / ICE_INT64(1000)); +#endif + } } Time diff --git a/cpp/src/IceUtil/Timer.cpp b/cpp/src/IceUtil/Timer.cpp index d08a35fea03..fd80db92f2c 100755 --- a/cpp/src/IceUtil/Timer.cpp +++ b/cpp/src/IceUtil/Timer.cpp @@ -72,7 +72,7 @@ Timer::scheduleRepeated(const TimerTaskPtr& task, const IceUtil::Time& delay) return; } - const Token token(IceUtil::Time::now() + delay, delay, task); + const Token token(IceUtil::Time::now(IceUtil::Time::Monotonic) + delay, delay, task); bool inserted = _tasks.insert(make_pair(task, token.scheduledTime)).second; if(!inserted) { @@ -127,7 +127,7 @@ Timer::run() map<TimerTaskPtr, IceUtil::Time>::iterator p = _tasks.find(token.task); if(p != _tasks.end()) { - token.scheduledTime = IceUtil::Time::now() + token.delay; + token.scheduledTime = IceUtil::Time::now(IceUtil::Time::Monotonic) + token.delay; p->second = token.scheduledTime; _tokens.insert(token); } @@ -148,7 +148,7 @@ Timer::run() while(!_tokens.empty() && !_destroyed) { - const IceUtil::Time now = IceUtil::Time::now(); + const IceUtil::Time now = IceUtil::Time::now(IceUtil::Time::Monotonic); const Token& first = *(_tokens.begin()); if(first.scheduledTime <= now) { diff --git a/cpp/test/IceUtil/timer/Client.cpp b/cpp/test/IceUtil/timer/Client.cpp index c82ade188ee..7821b71699a 100644 --- a/cpp/test/IceUtil/timer/Client.cpp +++ b/cpp/test/IceUtil/timer/Client.cpp @@ -32,7 +32,7 @@ public: { Lock sync(*this); ++_count; - _run = IceUtil::Time::now(); + _run = IceUtil::Time::now(IceUtil::Time::Monotonic); //cerr << "run: " << _scheduledTime.toMicroSeconds() << " " << _run.toMicroSeconds() << endl; notifyAll(); } @@ -99,14 +99,14 @@ int main(int argc, char* argv[]) { TestTaskPtr task = new TestTask(); - timer->schedule(task, IceUtil::Time::now()); + timer->schedule(task, IceUtil::Time::now(IceUtil::Time::Monotonic)); task->waitForRun(); while(true) { - timer->schedule(task, IceUtil::Time::now()); + timer->schedule(task, IceUtil::Time::now(IceUtil::Time::Monotonic)); try { - timer->schedule(task, IceUtil::Time::now()); + timer->schedule(task, IceUtil::Time::now(IceUtil::Time::Monotonic)); test(task->hasRun()); } catch(const IceUtil::IllegalArgumentException&) @@ -120,7 +120,7 @@ int main(int argc, char* argv[]) { TestTaskPtr task = new TestTask(); test(!timer->cancel(task)); - timer->schedule(task, IceUtil::Time::now() + IceUtil::Time::seconds(1)); + timer->schedule(task, IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::seconds(1)); test(!task->hasRun() && timer->cancel(task) && !task->hasRun()); test(!timer->cancel(task)); IceUtil::ThreadControl::sleep(IceUtil::Time::milliSeconds(1100)); @@ -129,7 +129,7 @@ int main(int argc, char* argv[]) { vector<TestTaskPtr> tasks; - IceUtil::Time start = IceUtil::Time::now() + IceUtil::Time::milliSeconds(100); + IceUtil::Time start = IceUtil::Time::now(IceUtil::Time::Monotonic) + IceUtil::Time::milliSeconds(100); for(int i = 0; i < 100; ++i) { tasks.push_back(new TestTask(start + IceUtil::Time::milliSeconds(i))); @@ -148,7 +148,7 @@ int main(int argc, char* argv[]) (*p)->waitForRun(); } - test(IceUtil::Time::now() - start > IceUtil::Time::milliSeconds(99)); + test(IceUtil::Time::now(IceUtil::Time::Monotonic) - start > IceUtil::Time::milliSeconds(99)); sort(tasks.begin(), tasks.end()); for(p = tasks.begin(); p + 1 != tasks.end(); ++p) diff --git a/cs/src/Ice/ConnectionI.cs b/cs/src/Ice/ConnectionI.cs index 85427c3287a..199baae5833 100755 --- a/cs/src/Ice/ConnectionI.cs +++ b/cs/src/Ice/ConnectionI.cs @@ -182,7 +182,7 @@ namespace Ice { if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.DateTime.Now.Ticks / 10000 + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } // @@ -367,7 +367,7 @@ namespace Ice if(_state != StateClosed && _endpoint.timeout() >= 0) { long absoluteWaitTime = _stateTime + _endpoint.timeout(); - int waitTime = (int)(absoluteWaitTime - System.DateTime.Now.Ticks / 10000); + int waitTime = (int)(absoluteWaitTime - IceInternal.Time.currentMonotonicTimeMillis()); if(waitTime > 0) { @@ -376,7 +376,7 @@ namespace Ice // this connection. // Monitor.Wait(this, waitTime); - if(System.DateTime.Now.Ticks / 10000 >= absoluteWaitTime) + if(IceInternal.Time.currentMonotonicTimeMillis() >= absoluteWaitTime) { setState(StateClosed, new CloseTimeoutException()); } @@ -453,7 +453,7 @@ namespace Ice !_batchStreamInUse && _batchStream.isEmpty() && _dispatchCount == 0) { - if(System.DateTime.Now.Ticks / 10000 >= _acmAbsoluteTimeoutMillis) + if(IceInternal.Time.currentMonotonicTimeMillis() >= _acmAbsoluteTimeoutMillis) { setState(StateClosing, new ConnectionTimeoutException()); return; @@ -587,7 +587,7 @@ namespace Ice if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.DateTime.Now.Ticks / 10000 + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } } @@ -696,7 +696,7 @@ namespace Ice if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.DateTime.Now.Ticks / 10000 + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } } @@ -977,7 +977,7 @@ namespace Ice if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.DateTime.Now.Ticks / 10000 + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } // @@ -1096,7 +1096,7 @@ namespace Ice if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.DateTime.Now.Ticks / 10000 + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } } catch(LocalException ex) @@ -1445,7 +1445,7 @@ namespace Ice _batchRequestCompress = false; _dispatchCount = 0; _state = StateNotValidated; - _stateTime = System.DateTime.Now.Ticks / 10000; + _stateTime = IceInternal.Time.currentMonotonicTimeMillis(); if(_endpoint.datagram()) { @@ -1779,7 +1779,7 @@ namespace Ice } _state = state; - _stateTime = System.DateTime.Now.Ticks / 10000; + _stateTime = IceInternal.Time.currentMonotonicTimeMillis(); Monitor.PulseAll(this); @@ -1873,7 +1873,7 @@ namespace Ice if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.DateTime.Now.Ticks / 10000 + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } try diff --git a/cs/src/Ice/LocatorInfo.cs b/cs/src/Ice/LocatorInfo.cs index 9fe258c7290..2a836790905 100755 --- a/cs/src/Ice/LocatorInfo.cs +++ b/cs/src/Ice/LocatorInfo.cs @@ -459,7 +459,8 @@ namespace IceInternal { lock(this) { - _adapterEndpointsTable[adapter] = new EndpointTableEntry(System.DateTime.Now.Ticks / 10000, endpoints); + _adapterEndpointsTable[adapter] = + new EndpointTableEntry(Time.currentMonotonicTimeMillis(), endpoints); } } @@ -495,7 +496,7 @@ namespace IceInternal { lock(this) { - _objectTable[id] = new ProxyTableEntry(System.DateTime.Now.Ticks / 10000, proxy); + _objectTable[id] = new ProxyTableEntry(Time.currentMonotonicTimeMillis(), proxy); } } @@ -518,7 +519,7 @@ namespace IceInternal } else { - return System.DateTime.Now.Ticks / 10000 - time <= ((long)ttl * 1000); + return Time.currentMonotonicTimeMillis() - time <= ((long)ttl * 1000); } } diff --git a/cs/src/Ice/Makefile b/cs/src/Ice/Makefile index 3570532543f..ca665ab40d1 100644 --- a/cs/src/Ice/Makefile +++ b/cs/src/Ice/Makefile @@ -84,6 +84,7 @@ SRCS = Acceptor.cs \ TcpTransceiver.cs \ ThreadPool.cs \ TieBase.cs \ + Time.cs \ Timer.cs \ TraceLevels.cs \ TraceUtil.cs \ diff --git a/cs/src/Ice/Makefile.mak b/cs/src/Ice/Makefile.mak index e5e2000ad67..66bae9edcb5 100644 --- a/cs/src/Ice/Makefile.mak +++ b/cs/src/Ice/Makefile.mak @@ -84,6 +84,7 @@ SRCS = Acceptor.cs \ TcpTransceiver.cs \ ThreadPool.cs \ TieBase.cs \ + Time.cs \ Timer.cs \ TraceLevels.cs \ TraceUtil.cs \ diff --git a/cs/src/Ice/OutgoingAsync.cs b/cs/src/Ice/OutgoingAsync.cs index 7df70123c5f..d6611d9ea48 100755 --- a/cs/src/Ice/OutgoingAsync.cs +++ b/cs/src/Ice/OutgoingAsync.cs @@ -224,7 +224,7 @@ namespace IceInternal if(absoluteTimeoutMillis > 0) { - return System.DateTime.Now.Ticks / 10000 >= absoluteTimeoutMillis; + return Time.currentMonotonicTimeMillis() >= absoluteTimeoutMillis; } else { @@ -339,7 +339,7 @@ namespace IceInternal { if(con.timeout() >= 0) { - _absoluteTimeoutMillis = System.DateTime.Now.Ticks / 10000 + con.timeout(); + _absoluteTimeoutMillis = Time.currentMonotonicTimeMillis() + con.timeout(); } else { diff --git a/cs/src/Ice/Time.cs b/cs/src/Ice/Time.cs new file mode 100755 index 00000000000..771e5a1de66 --- /dev/null +++ b/cs/src/Ice/Time.cs @@ -0,0 +1,42 @@ +// ********************************************************************** +// +// Copyright (c) 2003-2007 ZeroC, Inc. All rights reserved. +// +// This copy of Ice is licensed to you under the terms described in the +// ICE_LICENSE file included in this distribution. +// +// ********************************************************************** + +namespace IceInternal +{ + using System.Runtime.InteropServices; + + public sealed class Time + { + [DllImport("Kernel32.dll")] + private static extern bool QueryPerformanceCounter(out long lpPerformanceCount); + + [DllImport("Kernel32.dll")] + private static extern bool QueryPerformanceFrequency(out long lpFrequency); + + public static long currentMonotonicTimeMillis() + { + if(AssemblyUtil.platform_ == AssemblyUtil.Platform.Windows) + { + if(_frequency == -1) + { + QueryPerformanceFrequency(out _frequency); + } + long current; + QueryPerformanceCounter(out current); + return (long)(1000.0 / _frequency * current); + } + else + { + return System.DateTime.Now.Ticks / 10000; + } + } + + private static long _frequency = -1; + } +} diff --git a/cs/src/Ice/Timer.cs b/cs/src/Ice/Timer.cs index 99d0a7e882d..610dfc1acf0 100644 --- a/cs/src/Ice/Timer.cs +++ b/cs/src/Ice/Timer.cs @@ -49,7 +49,7 @@ namespace IceInternal return; } - Token token = new Token(System.DateTime.Now.Ticks / 10000 + delay, ++_tokenId, 0, task); + Token token = new Token(Time.currentMonotonicTimeMillis() + delay, ++_tokenId, 0, task); try { @@ -77,7 +77,7 @@ namespace IceInternal return; } - Token token = new Token(System.DateTime.Now.Ticks / 10000 + period, ++_tokenId, period, task); + Token token = new Token(Time.currentMonotonicTimeMillis() + period, ++_tokenId, period, task); try { @@ -152,7 +152,7 @@ namespace IceInternal { if(_tasks.ContainsKey(token.task)) { - token.scheduledTime = System.DateTime.Now.Ticks / 10000 + token.delay; + token.scheduledTime = Time.currentMonotonicTimeMillis() + token.delay; _tokens.Add(token, null); } } @@ -177,7 +177,7 @@ namespace IceInternal while(_tokens.Count > 0 && _instance != null) { - long now = System.DateTime.Now.Ticks / 10000; + long now = Time.currentMonotonicTimeMillis(); Token first = null; foreach(Token t in _tokens.Keys) @@ -280,4 +280,4 @@ namespace IceInternal private int _tokenId = 0; private Thread _thread; } -}
\ No newline at end of file +} diff --git a/java/jdk/1.4/IceInternal/Time.java b/java/jdk/1.4/IceInternal/Time.java index e0eced23e49..0f149ebc057 100644 --- a/java/jdk/1.4/IceInternal/Time.java +++ b/java/jdk/1.4/IceInternal/Time.java @@ -11,7 +11,7 @@ package IceInternal; final public class Time { - static long + static public long currentMonotonicTimeMillis() { // @@ -20,4 +20,4 @@ final public class Time // return System.currentTimeMillis(); } -};
\ No newline at end of file +}; diff --git a/java/jdk/1.5/IceInternal/Time.java b/java/jdk/1.5/IceInternal/Time.java index 6c5be83e920..d77879ef836 100644 --- a/java/jdk/1.5/IceInternal/Time.java +++ b/java/jdk/1.5/IceInternal/Time.java @@ -11,9 +11,9 @@ package IceInternal; final public class Time { - static long + static public long currentMonotonicTimeMillis() { return System.nanoTime() / 1000000; } -};
\ No newline at end of file +}; diff --git a/java/src/Freeze/BackgroundSaveEvictorI.java b/java/src/Freeze/BackgroundSaveEvictorI.java index dc27914731f..e5accc6bc79 100644 --- a/java/src/Freeze/BackgroundSaveEvictorI.java +++ b/java/src/Freeze/BackgroundSaveEvictorI.java @@ -68,7 +68,7 @@ class BackgroundSaveEvictorI extends EvictorI implements BackgroundSaveEvictor, { if(_active) { - startTime = System.currentTimeMillis(); + startTime = IceInternal.Time.currentMonotonicTimeMillis(); wait(_timeout); } else @@ -88,7 +88,7 @@ class BackgroundSaveEvictorI extends EvictorI implements BackgroundSaveEvictor, // // Did we timeout? // - if(System.currentTimeMillis() - startTime >= _timeout) + if(IceInternal.Time.currentMonotonicTimeMillis() - startTime >= _timeout) { _communicator.getLogger().error(_errorPrefix + "Fatal error: streaming watch dog thread timed out."); @@ -276,7 +276,7 @@ class BackgroundSaveEvictorI extends EvictorI implements BackgroundSaveEvictor, ObjectRecord rec = element.rec; rec.servant = servant; - rec.stats.creationTime = System.currentTimeMillis(); + rec.stats.creationTime = IceInternal.Time.currentMonotonicTimeMillis(); rec.stats.lastSaveTime = 0; rec.stats.avgSaveTime = 0; @@ -985,9 +985,9 @@ class BackgroundSaveEvictorI extends EvictorI implements BackgroundSaveEvictor, } else { - long preSave = System.currentTimeMillis(); + long preSave = IceInternal.Time.currentMonotonicTimeMillis(); wait(_savePeriod); - if(System.currentTimeMillis() > preSave + _savePeriod) + if(IceInternal.Time.currentMonotonicTimeMillis() > preSave + _savePeriod) { break; } @@ -1028,7 +1028,7 @@ class BackgroundSaveEvictorI extends EvictorI implements BackgroundSaveEvictor, java.util.List streamedObjectQueue = new java.util.ArrayList(); - long streamStart = System.currentTimeMillis(); + long streamStart = IceInternal.Time.currentMonotonicTimeMillis(); // // Stream each element @@ -1146,7 +1146,7 @@ class BackgroundSaveEvictorI extends EvictorI implements BackgroundSaveEvictor, if(_trace >= 1) { - long now = System.currentTimeMillis(); + long now = IceInternal.Time.currentMonotonicTimeMillis(); _communicator.getLogger().trace("Freeze.Evictor", "streamed " + streamedObjectQueue.size() + " objects in " + (now - streamStart) + " ms"); } @@ -1178,7 +1178,7 @@ class BackgroundSaveEvictorI extends EvictorI implements BackgroundSaveEvictor, txSize = streamedObjectQueue.size(); } - long saveStart = System.currentTimeMillis(); + long saveStart = IceInternal.Time.currentMonotonicTimeMillis(); String txnId = null; try @@ -1231,7 +1231,7 @@ class BackgroundSaveEvictorI extends EvictorI implements BackgroundSaveEvictor, if(_trace >= 1) { - long now = System.currentTimeMillis(); + long now = IceInternal.Time.currentMonotonicTimeMillis(); _communicator.getLogger().trace("Freeze.Evictor", "saved " + txSize + " objects in " + (now - saveStart) + " ms"); } diff --git a/java/src/Freeze/TransactionalEvictorContext.java b/java/src/Freeze/TransactionalEvictorContext.java index 5ab2577d93a..800c3bf59f3 100644 --- a/java/src/Freeze/TransactionalEvictorContext.java +++ b/java/src/Freeze/TransactionalEvictorContext.java @@ -169,7 +169,7 @@ class TransactionalEvictorContext implements Ice.DispatchInterceptorAsyncCallbac { if(!_readOnly && !_removed) { - EvictorI.updateStats(_rec.stats, System.currentTimeMillis()); + EvictorI.updateStats(_rec.stats, IceInternal.Time.currentMonotonicTimeMillis()); _store.update(_current.id, _rec, _tx); if(_trace >= 3) diff --git a/java/src/Freeze/TransactionalEvictorI.java b/java/src/Freeze/TransactionalEvictorI.java index 4f7dc0a9e65..932efcf5bc0 100644 --- a/java/src/Freeze/TransactionalEvictorI.java +++ b/java/src/Freeze/TransactionalEvictorI.java @@ -61,7 +61,7 @@ class TransactionalEvictorI extends EvictorI implements TransactionalEvictor _deactivateController.lock(); try { - long currentTime = System.currentTimeMillis(); + long currentTime = IceInternal.Time.currentMonotonicTimeMillis(); ObjectRecord rec = new ObjectRecord(servant, new Statistics(currentTime, 0, 0)); diff --git a/java/src/Ice/ConnectionI.java b/java/src/Ice/ConnectionI.java index fd43037a4b6..e1990c041a7 100644 --- a/java/src/Ice/ConnectionI.java +++ b/java/src/Ice/ConnectionI.java @@ -195,7 +195,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne { if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.currentTimeMillis() + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } // @@ -396,7 +396,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne if(_state != StateClosed && _endpoint.timeout() >= 0) { long absoluteWaitTime = _stateTime + _endpoint.timeout(); - long waitTime = absoluteWaitTime - System.currentTimeMillis(); + long waitTime = absoluteWaitTime - IceInternal.Time.currentMonotonicTimeMillis(); if(waitTime > 0) { @@ -405,7 +405,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne // connection. // wait(waitTime); - if(System.currentTimeMillis() >= absoluteWaitTime) + if(IceInternal.Time.currentMonotonicTimeMillis() >= absoluteWaitTime) { setState(StateClosed, new CloseTimeoutException()); } @@ -492,7 +492,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne !_batchStreamInUse && _batchStream.isEmpty() && _dispatchCount == 0) { - if(System.currentTimeMillis() >= _acmAbsoluteTimeoutMillis) + if(IceInternal.Time.currentMonotonicTimeMillis() >= _acmAbsoluteTimeoutMillis) { setState(StateClosing, new ConnectionTimeoutException()); return; @@ -555,7 +555,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.currentTimeMillis() + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } } @@ -703,7 +703,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.currentTimeMillis() + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } } @@ -1022,7 +1022,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.currentTimeMillis() + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } // @@ -1161,7 +1161,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.currentTimeMillis() + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } } catch(IceInternal.LocalExceptionWrapper ex) // Java-specific workaround in Transceiver.write(). @@ -1515,7 +1515,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne _batchRequestCompress = false; _dispatchCount = 0; _state = StateNotValidated; - _stateTime = System.currentTimeMillis(); + _stateTime = IceInternal.Time.currentMonotonicTimeMillis(); if(_endpoint.datagram()) { @@ -1874,7 +1874,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne } _state = state; - _stateTime = System.currentTimeMillis(); + _stateTime = IceInternal.Time.currentMonotonicTimeMillis(); notifyAll(); @@ -2037,7 +2037,7 @@ public final class ConnectionI extends IceInternal.EventHandler implements Conne if(_acmTimeout > 0) { - _acmAbsoluteTimeoutMillis = System.currentTimeMillis() + _acmTimeout * 1000; + _acmAbsoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + _acmTimeout * 1000; } try diff --git a/java/src/IceInternal/LocatorTable.java b/java/src/IceInternal/LocatorTable.java index 5e3e986890f..a9dab14bfc7 100644 --- a/java/src/IceInternal/LocatorTable.java +++ b/java/src/IceInternal/LocatorTable.java @@ -41,7 +41,8 @@ final class LocatorTable synchronized void addAdapterEndpoints(String adapter, IceInternal.EndpointI[] endpoints) { - _adapterEndpointsTable.put(adapter, new EndpointTableEntry(System.currentTimeMillis(), endpoints)); + _adapterEndpointsTable.put(adapter, + new EndpointTableEntry(IceInternal.Time.currentMonotonicTimeMillis(), endpoints)); } synchronized IceInternal.EndpointI[] @@ -70,7 +71,7 @@ final class LocatorTable synchronized void addProxy(Ice.Identity id, Ice.ObjectPrx proxy) { - _objectTable.put(id, new ProxyTableEntry(System.currentTimeMillis(), proxy)); + _objectTable.put(id, new ProxyTableEntry(IceInternal.Time.currentMonotonicTimeMillis(), proxy)); } synchronized Ice.ObjectPrx @@ -90,7 +91,7 @@ final class LocatorTable } else { - return System.currentTimeMillis() - time <= ((long)ttl * 1000); + return IceInternal.Time.currentMonotonicTimeMillis() - time <= ((long)ttl * 1000); } } diff --git a/java/src/IceInternal/OutgoingAsync.java b/java/src/IceInternal/OutgoingAsync.java index fa9e22315d1..8f49c69ac06 100644 --- a/java/src/IceInternal/OutgoingAsync.java +++ b/java/src/IceInternal/OutgoingAsync.java @@ -229,7 +229,7 @@ public abstract class OutgoingAsync // if(_absoluteTimeoutMillis > 0) { - return System.currentTimeMillis() >= _absoluteTimeoutMillis; + return IceInternal.Time.currentMonotonicTimeMillis() >= _absoluteTimeoutMillis; } else { @@ -347,7 +347,7 @@ public abstract class OutgoingAsync Ice.ConnectionI con = _delegate.__getConnection(comp); if(con.timeout() >= 0) { - _absoluteTimeoutMillis = System.currentTimeMillis() + con.timeout(); + _absoluteTimeoutMillis = IceInternal.Time.currentMonotonicTimeMillis() + con.timeout(); } else { diff --git a/java/src/IceInternal/TcpTransceiver.java b/java/src/IceInternal/TcpTransceiver.java index 8b5693fdb3f..f07bff3a62c 100644 --- a/java/src/IceInternal/TcpTransceiver.java +++ b/java/src/IceInternal/TcpTransceiver.java @@ -186,9 +186,9 @@ final class TcpTransceiver implements Transceiver { if(timeout > 0) { - long start = System.currentTimeMillis(); + long start = IceInternal.Time.currentMonotonicTimeMillis(); int n = _writeSelector.select(timeout); - if(n == 0 && System.currentTimeMillis() >= start + timeout) + if(n == 0 && IceInternal.Time.currentMonotonicTimeMillis() >= start + timeout) { throw new Ice.TimeoutException(); } @@ -286,9 +286,9 @@ final class TcpTransceiver implements Transceiver { if(timeout > 0) { - long start = System.currentTimeMillis(); + long start = IceInternal.Time.currentMonotonicTimeMillis(); int n = _readSelector.select(timeout); - if(n == 0 && System.currentTimeMillis() >= start + timeout) + if(n == 0 && IceInternal.Time.currentMonotonicTimeMillis() >= start + timeout) { throw new Ice.TimeoutException(); } |