You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@qpid.apache.org by as...@apache.org on 2014/07/01 18:55:43 UTC
svn commit: r1607140 - in /qpid/trunk/qpid/cpp/src: ./ qmf/ qpid/acl/
qpid/broker/ qpid/management/ qpid/sys/ qpid/sys/posix/ qpid/sys/windows/
tests/
Author: astitcher
Date: Tue Jul 1 16:55:43 2014
New Revision: 1607140
URL: http://svn.apache.org/r1607140
Log:
QPID-5865: Be more robust in face of system clock being changed:
- Separate Wall clock time uses from other time
* (assumed that any time with respect to the epoch is wallclock)
- For Posix use CLOCK_MONOTONIC for all non wall clock purposes
so that changing system time doesn't affect internal timekeeping
- For Windows kept the same time keeping scheme.
Added:
qpid/trunk/qpid/cpp/src/qpid/sys/posix/Condition.cpp
Modified:
qpid/trunk/qpid/cpp/src/CMakeLists.txt
qpid/trunk/qpid/cpp/src/qmf/AgentSession.cpp
qpid/trunk/qpid/cpp/src/qmf/ConsoleSession.cpp
qpid/trunk/qpid/cpp/src/qpid/acl/Acl.cpp
qpid/trunk/qpid/cpp/src/qpid/broker/PagedQueue.cpp
qpid/trunk/qpid/cpp/src/qpid/broker/Selector.cpp
qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.cpp
qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp
qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.cpp
qpid/trunk/qpid/cpp/src/qpid/sys/Time.h
qpid/trunk/qpid/cpp/src/qpid/sys/posix/Condition.h
qpid/trunk/qpid/cpp/src/qpid/sys/posix/PrivatePosix.h
qpid/trunk/qpid/cpp/src/qpid/sys/posix/Time.cpp
qpid/trunk/qpid/cpp/src/qpid/sys/windows/Time.cpp
qpid/trunk/qpid/cpp/src/tests/Statistics.cpp
qpid/trunk/qpid/cpp/src/tests/echotest.cpp
qpid/trunk/qpid/cpp/src/tests/qpid-latency-test.cpp
qpid/trunk/qpid/cpp/src/tests/qpid-send.cpp
Modified: qpid/trunk/qpid/cpp/src/CMakeLists.txt
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/CMakeLists.txt?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/CMakeLists.txt (original)
+++ qpid/trunk/qpid/cpp/src/CMakeLists.txt Tue Jul 1 16:55:43 2014
@@ -687,6 +687,7 @@ else (CMAKE_SYSTEM_NAME STREQUAL Windows
set (qpidcommon_platform_SOURCES
qpid/sys/posix/AsynchIO.cpp
+ qpid/sys/posix/Condition.cpp
qpid/sys/posix/Fork.cpp
qpid/sys/posix/Path.cpp
qpid/sys/posix/FileSysDir.cpp
Modified: qpid/trunk/qpid/cpp/src/qmf/AgentSession.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qmf/AgentSession.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qmf/AgentSession.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qmf/AgentSession.cpp Tue Jul 1 16:55:43 2014
@@ -76,7 +76,7 @@ AgentSessionImpl::AgentSessionImpl(Conne
externalStorage(false), autoAllowQueries(true), autoAllowMethods(true),
maxSubscriptions(64), minSubInterval(3000), subLifetime(300), publicEvents(true),
listenOnDirect(true), strictSecurity(false), maxThreadWaitTime(5),
- schemaUpdateTime(uint64_t(qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now())))
+ schemaUpdateTime(uint64_t(qpid::sys::Duration::FromEpoch()))
{
//
// Set Agent Capability Level
@@ -288,7 +288,7 @@ void AgentSessionImpl::registerSchema(Sc
//
// Get the news out at the next periodic interval that there is new schema information.
//
- schemaUpdateTime = uint64_t(qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now()));
+ schemaUpdateTime = uint64_t(qpid::sys::Duration::FromEpoch());
forceHeartbeat = true;
}
@@ -509,7 +509,7 @@ void AgentSessionImpl::raiseEvent(const
Variant::List list;
Variant::Map dataAsMap(DataImplAccess::get(data).asMap());
dataAsMap["_severity"] = severity;
- dataAsMap["_timestamp"] = uint64_t(qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now()));
+ dataAsMap["_timestamp"] = uint64_t(qpid::sys::Duration::FromEpoch());
list.push_back(dataAsMap);
encode(list, msg);
topicSender.send(msg);
@@ -591,7 +591,7 @@ void AgentSessionImpl::handleLocateReque
headers[protocol::HEADER_KEY_APP_ID] = protocol::HEADER_APP_ID_QMF;
map["_values"] = attributes;
- map["_values"].asMap()[protocol::AGENT_ATTR_TIMESTAMP] = uint64_t(qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now()));
+ map["_values"].asMap()[protocol::AGENT_ATTR_TIMESTAMP] = uint64_t(qpid::sys::Duration::FromEpoch());
map["_values"].asMap()[protocol::AGENT_ATTR_HEARTBEAT_INTERVAL] = interval;
map["_values"].asMap()[protocol::AGENT_ATTR_EPOCH] = bootSequence;
map["_values"].asMap()[protocol::AGENT_ATTR_SCHEMA_UPDATED_TIMESTAMP] = schemaUpdateTime;
@@ -883,7 +883,7 @@ void AgentSessionImpl::sendHeartbeat()
msg.setSubject(address.str());
map["_values"] = attributes;
- map["_values"].asMap()[protocol::AGENT_ATTR_TIMESTAMP] = uint64_t(qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now()));
+ map["_values"].asMap()[protocol::AGENT_ATTR_TIMESTAMP] = uint64_t(qpid::sys::Duration::FromEpoch());
map["_values"].asMap()[protocol::AGENT_ATTR_HEARTBEAT_INTERVAL] = interval;
map["_values"].asMap()[protocol::AGENT_ATTR_EPOCH] = bootSequence;
map["_values"].asMap()[protocol::AGENT_ATTR_SCHEMA_UPDATED_TIMESTAMP] = schemaUpdateTime;
@@ -992,7 +992,7 @@ void AgentSessionImpl::run()
try {
while (!threadCanceled) {
- periodicProcessing((uint64_t) qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now()) / qpid::sys::TIME_SEC);
+ periodicProcessing((uint64_t) qpid::sys::Duration::FromEpoch() / qpid::sys::TIME_SEC);
Receiver rx;
bool valid = session.nextReceiver(rx, Duration::SECOND * maxThreadWaitTime);
Modified: qpid/trunk/qpid/cpp/src/qmf/ConsoleSession.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qmf/ConsoleSession.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qmf/ConsoleSession.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qmf/ConsoleSession.cpp Tue Jul 1 16:55:43 2014
@@ -645,7 +645,7 @@ void ConsoleSessionImpl::run()
try {
while (!threadCanceled) {
- periodicProcessing((uint64_t) qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now()) /
+ periodicProcessing((uint64_t) qpid::sys::Duration::FromEpoch() /
qpid::sys::TIME_SEC);
Receiver rx;
Modified: qpid/trunk/qpid/cpp/src/qpid/acl/Acl.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/acl/Acl.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/acl/Acl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/acl/Acl.cpp Tue Jul 1 16:55:43 2014
@@ -280,9 +280,7 @@ bool Acl::readAclFile(std::string& aclFi
if (mgmtObject!=0){
mgmtObject->set_transferAcl(transferAcl?1:0);
mgmtObject->set_policyFile(aclFile);
- sys::AbsTime now = sys::AbsTime::now();
- int64_t ns = sys::Duration(sys::EPOCH, now);
- mgmtObject->set_lastAclLoad(ns);
+ mgmtObject->set_lastAclLoad(Duration::FromEpoch());
agent->raiseEvent(_qmf::EventFileLoaded(""));
}
return true;
@@ -305,9 +303,7 @@ void Acl::loadEmptyAclRuleset() {
if (mgmtObject!=0){
mgmtObject->set_transferAcl(transferAcl?1:0);
mgmtObject->set_policyFile("");
- sys::AbsTime now = sys::AbsTime::now();
- int64_t ns = sys::Duration(sys::EPOCH, now);
- mgmtObject->set_lastAclLoad(ns);
+ mgmtObject->set_lastAclLoad(Duration::FromEpoch());
agent->raiseEvent(_qmf::EventFileLoaded(""));
}
}
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/PagedQueue.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/PagedQueue.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/PagedQueue.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/PagedQueue.cpp Tue Jul 1 16:55:43 2014
@@ -32,7 +32,7 @@ namespace broker {
namespace {
using qpid::sys::AbsTime;
using qpid::sys::Duration;
-using qpid::sys::EPOCH;
+using qpid::sys::ZERO;
using qpid::sys::FAR_FUTURE;
using qpid::sys::MemoryMappedFile;
const uint32_t OVERHEAD(4/*content-size*/ + 4/*sequence-number*/ + 8/*persistence-id*/ + 8/*expiration*/);
@@ -54,7 +54,8 @@ size_t encode(const Message& msg, char*
sys::AbsTime expiration = msg.getExpiration();
int64_t t(0);
if (expiration < FAR_FUTURE) {
- t = Duration(EPOCH, expiration);
+ // Just need an integer that will round trip
+ t = Duration(ZERO, expiration);
}
buffer.putLongLong(t);
msg.getPersistentContext()->encode(buffer);
@@ -76,7 +77,7 @@ size_t decode(ProtocolRegistry& protocol
msg.setSequence(qpid::framing::SequenceNumber(sequence));
msg.getPersistentContext()->setPersistenceId(persistenceId);
if (t) {
- sys::AbsTime expiration(EPOCH, t);
+ sys::AbsTime expiration(ZERO, t);
msg.getSharedState().setExpiration(expiration);
}
return encoded + metadata.getPosition();
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/Selector.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/Selector.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/Selector.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/Selector.cpp Tue Jul 1 16:55:43 2014
@@ -117,7 +117,7 @@ const Value MessageSelectorEnv::specialV
qpid::sys::AbsTime expiry = msg.getExpiration();
// Java property has value of 0 for no expiry
v = (expiry==qpid::sys::FAR_FUTURE) ? 0
- : qpid::sys::Duration(qpid::sys::AbsTime::Epoch(), expiry) / qpid::sys::TIME_MSEC;
+ : qpid::sys::Duration(qpid::sys::AbsTime::epoch(), expiry) / qpid::sys::TIME_MSEC;
} else if ( id=="creation_time" ) {
// Use the time put on queue (if it is enabled) as 0-10 has no standard way to get message
// creation time and we're not paying attention to the 1.0 creation time yet.
Modified: qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/broker/SessionManager.cpp Tue Jul 1 16:55:43 2014
@@ -70,9 +70,9 @@ void SessionManager::detach(std::auto_p
attached.erase(session->getId());
session->detach();
if (session->getTimeout() > 0) {
- session->expiry = AbsTime(now(),session->getTimeout()*TIME_SEC);
+ session->expiry = AbsTime(now(), session->getTimeout()*TIME_SEC);
if (session->mgmtObject != 0)
- session->mgmtObject->set_expireTime ((uint64_t) Duration (EPOCH, session->expiry));
+ session->mgmtObject->set_expireTime (Duration::FromEpoch()+session->getTimeout()*TIME_SEC);
detached.push_back(session.release()); // In expiry order
eraseExpired();
}
Modified: qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/management/ManagementAgent.cpp Tue Jul 1 16:55:43 2014
@@ -416,7 +416,7 @@ void ManagementAgent::raiseEvent(const M
outBuffer.putShortString(event.getPackageName());
outBuffer.putShortString(event.getEventName());
outBuffer.putBin128(event.getMd5Sum());
- outBuffer.putLongLong(uint64_t(sys::Duration(sys::EPOCH, sys::now())));
+ outBuffer.putLongLong(sys::Duration::FromEpoch());
outBuffer.putOctet(sev);
string sBuf;
event.encode(sBuf);
@@ -438,7 +438,7 @@ void ManagementAgent::raiseEvent(const M
event.getMd5Sum());
event.mapEncode(values);
map_["_values"] = values;
- map_["_timestamp"] = uint64_t(sys::Duration(sys::EPOCH, sys::now()));
+ map_["_timestamp"] = uint64_t(sys::Duration::FromEpoch());
map_["_severity"] = sev;
headers["method"] = "indication";
@@ -1048,7 +1048,7 @@ void ManagementAgent::periodicProcessing
char msgChars[qmfV1BufferSize];
Buffer msgBuffer(msgChars, qmfV1BufferSize);
encodeHeader(msgBuffer, 'h');
- msgBuffer.putLongLong(uint64_t(sys::Duration(sys::EPOCH, sys::now())));
+ msgBuffer.putLongLong(sys::Duration::FromEpoch());
routingKey = "console.heartbeat.1.0";
sendBuffer(msgBuffer, mExchange, routingKey);
@@ -1070,7 +1070,7 @@ void ManagementAgent::periodicProcessing
headers["qmf.agent"] = name_address;
map["_values"] = attrMap;
- map["_values"].asMap()["_timestamp"] = uint64_t(sys::Duration(sys::EPOCH, sys::now()));
+ map["_values"].asMap()["_timestamp"] = uint64_t(sys::Duration::FromEpoch());
map["_values"].asMap()["_heartbeat_interval"] = interval;
map["_values"].asMap()["_epoch"] = bootSequence;
@@ -2132,7 +2132,7 @@ void ManagementAgent::handleLocateReques
headers["qmf.agent"] = name_address;
map["_values"] = attrMap;
- map["_values"].asMap()["_timestamp"] = uint64_t(sys::Duration(sys::EPOCH, sys::now()));
+ map["_values"].asMap()["_timestamp"] = uint64_t(sys::Duration::FromEpoch());
map["_values"].asMap()["_heartbeat_interval"] = interval;
map["_values"].asMap()["_epoch"] = bootSequence;
Modified: qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/management/ManagementObject.cpp Tue Jul 1 16:55:43 2014
@@ -246,20 +246,20 @@ ostream& operator<<(ostream& out, const
}}
ManagementObject::ManagementObject(Manageable* _core) :
-createTime(qpid::sys::Duration(sys::EPOCH, sys::now())),
- destroyTime(0), updateTime(createTime), configChanged(true),
- instChanged(true), deleted(false),
- coreObject(_core), flags(0), forcePublish(false) {}
+ createTime(qpid::sys::Duration::FromEpoch()),
+ destroyTime(0), updateTime(createTime), configChanged(true),
+ instChanged(true), deleted(false),
+ coreObject(_core), flags(0), forcePublish(false) {}
void ManagementObject::setUpdateTime()
{
- updateTime = sys::Duration(sys::EPOCH, sys::now());
+ updateTime = sys::Duration::FromEpoch();
}
void ManagementObject::resourceDestroy()
{
QPID_LOG(trace, "Management object marked deleted: " << getObjectId().getV2Key());
- destroyTime = sys::Duration(sys::EPOCH, sys::now());
+ destroyTime = sys::Duration::FromEpoch();
deleted = true;
}
Modified: qpid/trunk/qpid/cpp/src/qpid/sys/Time.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/Time.h?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/Time.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/Time.h Tue Jul 1 16:55:43 2014
@@ -62,11 +62,11 @@ class Duration;
* ...
* when = AbsTime(when, 2*TIME_SEC); // Advance timer 2 secs
*
- * AbsTime is not intended to be used to represent calendar dates/times
- * but you can construct a Duration since the Unix Epoch, 1970-1-1-00:00,
- * so that you can convert to a date/time if needed:
+ * AbsTime is not intended to be used to represent calendar dates/times.
+ * There is a specific way to construct a Duration since the Unix Epoch,
+ * 1970-1-1-00:00:
*
- * int64_t nanosec_since_epoch = Duration(EPOCH, now());
+ * int64_t nanosec_since_epoch = Duration::FromEpoch();
*
* There are some sensible operations that are currently missing from
* AbsTime, but nearly all that's needed can be done with a mixture of
@@ -91,8 +91,9 @@ public:
// Default copy constructor fine
QPID_COMMON_EXTERN static AbsTime now();
+ QPID_COMMON_EXTERN static AbsTime epoch();
QPID_COMMON_EXTERN static AbsTime FarFuture();
- QPID_COMMON_EXTERN static AbsTime Epoch();
+ QPID_COMMON_EXTERN static AbsTime Zero();
bool operator==(const AbsTime& t) const { return t.timepoint == timepoint; }
@@ -121,6 +122,10 @@ class Duration {
public:
QPID_COMMON_INLINE_EXTERN inline Duration(int64_t time0 = 0);
QPID_COMMON_EXTERN explicit Duration(const AbsTime& start, const AbsTime& finish);
+
+ /** Duration since the Unix epoch: 1970-01-01T00:00:00 */
+ QPID_COMMON_EXTERN static Duration FromEpoch();
+
inline operator int64_t() const;
};
@@ -153,8 +158,8 @@ const Duration TIME_NSEC = 1;
/** Value to represent an infinite timeout */
const Duration TIME_INFINITE = std::numeric_limits<int64_t>::max();
-/** Absolute time point for the Unix epoch: 1970-01-01T00:00:00 */
-const AbsTime EPOCH = AbsTime::Epoch();
+/** Absolute time zero point */
+const AbsTime ZERO = AbsTime::Zero();
/** Time greater than any other time */
const AbsTime FAR_FUTURE = AbsTime::FarFuture();
Added: qpid/trunk/qpid/cpp/src/qpid/sys/posix/Condition.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/posix/Condition.cpp?rev=1607140&view=auto
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/posix/Condition.cpp (added)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/posix/Condition.cpp Tue Jul 1 16:55:43 2014
@@ -0,0 +1,45 @@
+/*
+ *
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements. See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership. The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License. You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ *
+ */
+
+#include "Condition.h"
+
+namespace qpid {
+namespace sys {
+
+namespace {
+
+struct ClockMonotonicAttr {
+ ::pthread_condattr_t attr;
+
+ ClockMonotonicAttr() {
+ QPID_POSIX_ASSERT_THROW_IF(pthread_condattr_init(&attr));
+ QPID_POSIX_ASSERT_THROW_IF(pthread_condattr_setclock(&attr, CLOCK_MONOTONIC));
+ }
+};
+
+}
+
+Condition::Condition() {
+ static ClockMonotonicAttr attr;
+ QPID_POSIX_ASSERT_THROW_IF(pthread_cond_init(&condition, &attr.attr));
+}
+
+}}
Modified: qpid/trunk/qpid/cpp/src/qpid/sys/posix/Condition.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/posix/Condition.h?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/posix/Condition.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/posix/Condition.h Tue Jul 1 16:55:43 2014
@@ -40,32 +40,28 @@ namespace sys {
class Condition
{
public:
- inline Condition();
- inline ~Condition();
- inline void wait(Mutex&);
- inline bool wait(Mutex&, const AbsTime& absoluteTime);
- inline void notify();
- inline void notifyAll();
+ Condition();
+ ~Condition();
+ void wait(Mutex&);
+ bool wait(Mutex&, const AbsTime& absoluteTime);
+ void notify();
+ void notifyAll();
private:
pthread_cond_t condition;
};
-Condition::Condition() {
- QPID_POSIX_ASSERT_THROW_IF(pthread_cond_init(&condition, 0));
-}
-
-Condition::~Condition() {
+inline Condition::~Condition() {
QPID_POSIX_ABORT_IF(pthread_cond_destroy(&condition));
}
-void Condition::wait(Mutex& mutex) {
+inline void Condition::wait(Mutex& mutex) {
QPID_POSIX_ASSERT_THROW_IF(pthread_cond_wait(&condition, &mutex.mutex));
}
-bool Condition::wait(Mutex& mutex, const AbsTime& absoluteTime){
+inline bool Condition::wait(Mutex& mutex, const AbsTime& absoluteTime){
struct timespec ts;
- toTimespec(ts, Duration(EPOCH, absoluteTime));
+ toTimespec(ts, absoluteTime);
int status = pthread_cond_timedwait(&condition, &mutex.mutex, &ts);
if (status != 0) {
if (status == ETIMEDOUT) return false;
@@ -74,11 +70,11 @@ bool Condition::wait(Mutex& mutex, const
return true;
}
-void Condition::notify(){
+inline void Condition::notify(){
QPID_POSIX_ASSERT_THROW_IF(pthread_cond_signal(&condition));
}
-void Condition::notifyAll(){
+inline void Condition::notifyAll(){
QPID_POSIX_ASSERT_THROW_IF(pthread_cond_broadcast(&condition));
}
Modified: qpid/trunk/qpid/cpp/src/qpid/sys/posix/PrivatePosix.h
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/posix/PrivatePosix.h?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/posix/PrivatePosix.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/posix/PrivatePosix.h Tue Jul 1 16:55:43 2014
@@ -32,7 +32,7 @@ namespace qpid {
namespace sys {
// Private Time related implementation details
-struct timespec& toTimespec(struct timespec& ts, const Duration& t);
+struct timespec& toTimespec(struct timespec& ts, const AbsTime& t);
struct timeval& toTimeval(struct timeval& tv, const Duration& t);
Duration toTime(const struct timespec& ts);
Modified: qpid/trunk/qpid/cpp/src/qpid/sys/posix/Time.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/posix/Time.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/posix/Time.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/posix/Time.cpp Tue Jul 1 16:55:43 2014
@@ -42,7 +42,7 @@ AbsTime::AbsTime(const AbsTime& t, const
timepoint(d == Duration::max() ? max_abstime() : t.timepoint+d.nanosecs)
{}
-AbsTime AbsTime::Epoch() {
+AbsTime AbsTime::Zero() {
AbsTime epoch; epoch.timepoint = 0;
return epoch;
}
@@ -53,12 +53,22 @@ AbsTime AbsTime::FarFuture() {
AbsTime AbsTime::now() {
struct timespec ts;
- ::clock_gettime(CLOCK_REALTIME, &ts);
+ ::clock_gettime(CLOCK_MONOTONIC, &ts);
AbsTime time_now;
time_now.timepoint = toTime(ts).nanosecs;
return time_now;
}
+AbsTime AbsTime::epoch() {
+ return AbsTime(now(), -Duration::FromEpoch());
+}
+
+Duration Duration::FromEpoch() {
+ struct timespec ts;
+ ::clock_gettime(CLOCK_REALTIME, &ts);
+ return toTime(ts).nanosecs;
+}
+
Duration::Duration(const AbsTime& start, const AbsTime& finish) :
nanosecs(finish.timepoint - start.timepoint)
{}
@@ -68,7 +78,8 @@ namespace {
const time_t TIME_T_MAX = std::numeric_limits<time_t>::max();
}
-struct timespec& toTimespec(struct timespec& ts, const Duration& t) {
+struct timespec& toTimespec(struct timespec& ts, const AbsTime& a) {
+ Duration t(ZERO, a);
Duration secs = t / TIME_SEC;
ts.tv_sec = (secs > TIME_T_MAX) ? TIME_T_MAX : static_cast<time_t>(secs);
ts.tv_nsec = static_cast<long>(t % TIME_SEC);
Modified: qpid/trunk/qpid/cpp/src/qpid/sys/windows/Time.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/windows/Time.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/windows/Time.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/windows/Time.cpp Tue Jul 1 16:55:43 2014
@@ -68,7 +68,13 @@ AbsTime AbsTime::FarFuture() {
return ff;
}
-AbsTime AbsTime::Epoch() {
+AbsTime AbsTime::Zero() {
+ AbsTime time_epoch;
+ time_epoch.timepoint = boost::posix_time::from_time_t(0);
+ return time_epoch;
+}
+
+AbsTime AbsTime::epoch() {
AbsTime time_epoch;
time_epoch.timepoint = boost::posix_time::from_time_t(0);
return time_epoch;
@@ -80,6 +86,11 @@ AbsTime AbsTime::now() {
return time_now;
}
+Duration Duration::FromEpoch() {
+ time_duration d = boost::get_system_time() - boost::posix_time::from_time_t(0);
+ return d.total_nanoseconds();
+}
+
Duration::Duration(const AbsTime& start, const AbsTime& finish) {
time_duration d = finish.timepoint - start.timepoint;
nanosecs = d.total_nanoseconds();
Modified: qpid/trunk/qpid/cpp/src/tests/Statistics.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/Statistics.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/Statistics.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/Statistics.cpp Tue Jul 1 16:55:43 2014
@@ -64,7 +64,7 @@ void ThroughputAndLatency::message(const
if (i != m.getProperties().end()) {
++samples;
int64_t start(i->second.asInt64());
- int64_t end(sys::Duration(sys::EPOCH, sys::now()));
+ int64_t end(sys::Duration::FromEpoch());
double latency = double(end - start)/sys::TIME_MSEC;
if (latency > 0) {
total += latency;
Modified: qpid/trunk/qpid/cpp/src/tests/echotest.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/echotest.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/echotest.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/echotest.cpp Tue Jul 1 16:55:43 2014
@@ -64,8 +64,7 @@ struct Args : public qpid::Options,
uint64_t current_time()
{
- Duration t(EPOCH, now());
- return t;
+ return Duration::FromEpoch();
}
class Listener : public MessageListener
Modified: qpid/trunk/qpid/cpp/src/tests/qpid-latency-test.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/qpid-latency-test.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/qpid-latency-test.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/qpid-latency-test.cpp Tue Jul 1 16:55:43 2014
@@ -97,8 +97,7 @@ Connection globalConnection;
uint64_t current_time()
{
- Duration t(EPOCH, now());
- return t;
+ return Duration::FromEpoch();
}
struct Stats
@@ -364,7 +363,7 @@ void Sender::sendByRate()
AbsTime last = start;
while (true) {
AbsTime sentAt=now();
- msg.getDeliveryProperties().setTimestamp(Duration(EPOCH, sentAt));
+ msg.getDeliveryProperties().setTimestamp(Duration::FromEpoch());
async(session).messageTransfer(arg::content=msg, arg::acceptMode=1);
if (opts.sync) session.sync();
++sent;
Modified: qpid/trunk/qpid/cpp/src/tests/qpid-send.cpp
URL: http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/tests/qpid-send.cpp?rev=1607140&r1=1607139&r2=1607140&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/tests/qpid-send.cpp (original)
+++ qpid/trunk/qpid/cpp/src/tests/qpid-send.cpp Tue Jul 1 16:55:43 2014
@@ -409,7 +409,7 @@ int main(int argc, char ** argv)
if (opts.timestamp)
msg.getProperties()[TS] = int64_t(
- qpid::sys::Duration(qpid::sys::EPOCH, qpid::sys::now()));
+ qpid::sys::Duration::FromEpoch());
sender.send(msg);
reporter.message(msg);
---------------------------------------------------------------------
To unsubscribe, e-mail: commits-unsubscribe@qpid.apache.org
For additional commands, e-mail: commits-help@qpid.apache.org