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 * 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:
parent
45f4a40026
commit
ce602d08db
@ -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
|
||||||
|
@ -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;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user