summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cpp/config/Make.rules.Linux8
-rw-r--r--cpp/demo/Freeze/bench/Client.cpp4
-rw-r--r--cpp/demo/Freeze/casino/BankI.cpp2
-rw-r--r--cpp/demo/Freeze/casino/Timer.cpp143
-rw-r--r--cpp/demo/Freeze/casino/Timer.h57
-rw-r--r--cpp/demo/Freeze/customEvictor/Client.cpp10
-rw-r--r--cpp/demo/Ice/latency/Client.cpp4
-rwxr-xr-xcpp/demo/Ice/session/ReapThread.cpp2
-rwxr-xr-xcpp/demo/Ice/session/SessionI.cpp4
-rw-r--r--cpp/demo/Ice/throughput/Client.cpp4
-rwxr-xr-xcpp/demo/IcePatch2/MFC/PatchClientDlg.cpp4
-rw-r--r--cpp/include/IceUtil/Cond.h2
-rw-r--r--cpp/include/IceUtil/Time.h6
-rw-r--r--cpp/src/Freeze/BackgroundSaveEvictorI.cpp10
-rw-r--r--cpp/src/Freeze/TransactionalEvictorContext.cpp3
-rw-r--r--cpp/src/Freeze/TransactionalEvictorI.cpp2
-rw-r--r--cpp/src/Glacier2/RequestQueue.cpp4
-rw-r--r--cpp/src/Glacier2/RouterI.cpp8
-rw-r--r--cpp/src/Glacier2/SessionRouterI.cpp2
-rw-r--r--cpp/src/Ice/ConnectionI.cpp26
-rwxr-xr-xcpp/src/Ice/GC.cpp4
-rw-r--r--cpp/src/Ice/LocatorInfo.cpp11
-rw-r--r--cpp/src/IceGrid/Allocatable.cpp3
-rw-r--r--cpp/src/IceGrid/NodeSessionI.cpp4
-rw-r--r--cpp/src/IceGrid/ReapThread.cpp2
-rw-r--r--cpp/src/IceGrid/ReplicaSessionI.cpp4
-rw-r--r--cpp/src/IceGrid/ServerI.cpp19
-rw-r--r--cpp/src/IceGrid/SessionI.cpp4
-rw-r--r--cpp/src/IceGrid/WaitQueue.cpp6
-rw-r--r--cpp/src/IceStorm/Subscriber.cpp4
-rw-r--r--cpp/src/IceStorm/SubscriberPool.cpp10
-rw-r--r--cpp/src/IceUtil/Cond.cpp8
-rw-r--r--cpp/src/IceUtil/RWRecMutex.cpp12
-rw-r--r--cpp/src/IceUtil/Time.cpp54
-rwxr-xr-xcpp/src/IceUtil/Timer.cpp6
-rw-r--r--cpp/test/IceUtil/timer/Client.cpp14
-rwxr-xr-xcs/src/Ice/ConnectionI.cs22
-rwxr-xr-xcs/src/Ice/LocatorInfo.cs7
-rw-r--r--cs/src/Ice/Makefile1
-rw-r--r--cs/src/Ice/Makefile.mak1
-rwxr-xr-xcs/src/Ice/OutgoingAsync.cs4
-rwxr-xr-xcs/src/Ice/Time.cs42
-rw-r--r--cs/src/Ice/Timer.cs10
-rw-r--r--java/jdk/1.4/IceInternal/Time.java4
-rw-r--r--java/jdk/1.5/IceInternal/Time.java4
-rw-r--r--java/src/Freeze/BackgroundSaveEvictorI.java18
-rw-r--r--java/src/Freeze/TransactionalEvictorContext.java2
-rw-r--r--java/src/Freeze/TransactionalEvictorI.java2
-rw-r--r--java/src/Ice/ConnectionI.java22
-rw-r--r--java/src/IceInternal/LocatorTable.java7
-rw-r--r--java/src/IceInternal/OutgoingAsync.java4
-rw-r--r--java/src/IceInternal/TcpTransceiver.java8
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();
}