0
0
mirror of https://github.com/zeromq/libzmq.git synced 2024-12-29 00:32:34 +08:00

change macOS < 10.12 clock to SYSTEM_CLOCK, fixes #2537 (#2538)

* change macOS < 10.12 clock to SYSTEM_CLOCK, fixes #2537

* remove clock_id option from alt_clock_gettime since we always want a monotonic clock.

* update header definition for alt_clock_gettime

* pass clock definition down to host_get_clock_service for macOS < 10.12

* change to monotonic clocks
This commit is contained in:
Asmod4n 2017-04-20 00:13:06 +02:00 committed by Luca Boccassi
parent 45f4a40026
commit ce602d08db
2 changed files with 56 additions and 62 deletions

View File

@ -60,15 +60,9 @@
int alt_clock_gettime (int clock_id, timespec *ts) int alt_clock_gettime (int clock_id, timespec *ts)
{ {
// The clock_id specified is not supported on this system.
if (clock_id != CLOCK_REALTIME) {
errno = EINVAL;
return -1;
}
clock_serv_t cclock; clock_serv_t cclock;
mach_timespec_t mts; mach_timespec_t mts;
host_get_clock_service (mach_host_self (), CALENDAR_CLOCK, &cclock); host_get_clock_service (mach_host_self (), clock_id, &cclock);
clock_get_time (cclock, &mts); clock_get_time (cclock, &mts);
mach_port_deallocate (mach_task_self (), cclock); mach_port_deallocate (mach_task_self (), cclock);
ts->tv_sec = mts.tv_sec; ts->tv_sec = mts.tv_sec;
@ -162,8 +156,8 @@ uint64_t zmq::clock_t::now_us ()
// Use POSIX clock_gettime function to get precise monotonic time. // Use POSIX clock_gettime function to get precise monotonic time.
struct timespec tv; struct timespec tv;
#if defined ZMQ_HAVE_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200 // less than macOS 10.12 #if defined ZMQ_HAVE_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200 // less than macOS 10.12
int rc = alt_clock_gettime (CLOCK_MONOTONIC, &tv); int rc = alt_clock_gettime (SYSTEM_CLOCK, &tv);
#else #else
int rc = clock_gettime (CLOCK_MONOTONIC, &tv); int rc = clock_gettime (CLOCK_MONOTONIC, &tv);
#endif #endif
@ -250,7 +244,7 @@ uint64_t zmq::clock_t::rdtsc ()
#else #else
struct timespec ts; struct timespec ts;
#if defined ZMQ_HAVE_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200 // less than macOS 10.12 #if defined ZMQ_HAVE_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200 // less than macOS 10.12
alt_clock_gettime (CLOCK_MONOTONIC, &ts); alt_clock_gettime (SYSTEM_CLOCK, &ts);
#else #else
clock_gettime (CLOCK_MONOTONIC, &ts); clock_gettime (CLOCK_MONOTONIC, &ts);
#endif #endif

View File

@ -81,15 +81,15 @@ namespace zmq
#else #else
#ifdef ZMQ_HAVE_WINDOWS_TARGET_XP #ifdef ZMQ_HAVE_WINDOWS_TARGET_XP
#include <condition_variable> #include <condition_variable>
#include <mutex> #include <mutex>
#endif #endif
namespace zmq namespace zmq
{ {
#ifndef ZMQ_HAVE_WINDOWS_TARGET_XP #ifndef ZMQ_HAVE_WINDOWS_TARGET_XP
class condition_variable_t class condition_variable_t
{ {
public: public:
@ -133,51 +133,51 @@ namespace zmq
void operator = (const condition_variable_t&); void operator = (const condition_variable_t&);
}; };
#else #else
class condition_variable_t class condition_variable_t
{ {
public: public:
inline condition_variable_t() inline condition_variable_t()
{ {
} }
inline ~condition_variable_t() inline ~condition_variable_t()
{ {
} }
inline int wait(mutex_t* mutex_, int timeout_) inline int wait(mutex_t* mutex_, int timeout_)
{ {
std::unique_lock<std::mutex> lck(mtx); // lock mtx std::unique_lock<std::mutex> lck(mtx); // lock mtx
mutex_->unlock(); // unlock mutex_ mutex_->unlock(); // unlock mutex_
int res = 0; int res = 0;
if(timeout_ == -1) { if(timeout_ == -1) {
cv.wait(lck); // unlock mtx and wait cv.notify_all(), lock mtx after cv.notify_all() cv.wait(lck); // unlock mtx and wait cv.notify_all(), lock mtx after cv.notify_all()
} else if (cv.wait_for(lck, std::chrono::milliseconds(timeout_)) == std::cv_status::timeout) { } else if (cv.wait_for(lck, std::chrono::milliseconds(timeout_)) == std::cv_status::timeout) {
// time expired // time expired
errno = EAGAIN; errno = EAGAIN;
res = -1; res = -1;
} }
lck.unlock(); // unlock mtx lck.unlock(); // unlock mtx
mutex_->lock(); // lock mutex_ mutex_->lock(); // lock mutex_
return res; return res;
} }
inline void broadcast() inline void broadcast()
{ {
std::unique_lock<std::mutex> lck(mtx); // lock mtx std::unique_lock<std::mutex> lck(mtx); // lock mtx
cv.notify_all(); cv.notify_all();
} }
private: private:
std::condition_variable cv; std::condition_variable cv;
std::mutex mtx; std::mutex mtx;
// Disable copy construction and assignment. // Disable copy construction and assignment.
condition_variable_t(const condition_variable_t&); condition_variable_t(const condition_variable_t&);
void operator = (const condition_variable_t&); void operator = (const condition_variable_t&);
}; };
#endif #endif
} }
@ -214,9 +214,9 @@ namespace zmq
struct timespec timeout; struct timespec timeout;
#if defined ZMQ_HAVE_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200 // less than macOS 10.12 #if defined ZMQ_HAVE_OSX && __MAC_OS_X_VERSION_MIN_REQUIRED < 101200 // less than macOS 10.12
alt_clock_gettime(CLOCK_REALTIME, &timeout); alt_clock_gettime(SYSTEM_CLOCK, &timeout);
#else #else
clock_gettime(CLOCK_REALTIME, &timeout); clock_gettime(CLOCK_MONOTONIC, &timeout);
#endif #endif
timeout.tv_sec += timeout_ / 1000; timeout.tv_sec += timeout_ / 1000;