diff options
author | Yue Wang <Wang-Yue@users.noreply.github.com> | 2018-07-15 13:22:53 -0700 |
---|---|---|
committer | GitHub <noreply@github.com> | 2018-07-15 13:22:53 -0700 |
commit | 79937c9495d73539a4c6af20dc91d9cd098dd593 (patch) | |
tree | 8d3f129b08333215c4d8d54fa2d8b2800ebc9322 /src/thread | |
parent | 8aa2c574135ec147a59f36b032436fc9c6860f0c (diff) |
Support timed_wait in microseconds level
Some Audio plugin (such as ALSA, and soon CoreAudio) already support microsecond level buffer time. However, current interval less than 1000 microseconds will cause a bug that the code treated as 0 ms.
Diffstat (limited to 'src/thread')
-rw-r--r-- | src/thread/PosixCond.hxx | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/src/thread/PosixCond.hxx b/src/thread/PosixCond.hxx index e1c272071..c6a1b9096 100644 --- a/src/thread/PosixCond.hxx +++ b/src/thread/PosixCond.hxx @@ -75,13 +75,13 @@ public: } private: - bool timed_wait(PosixMutex &mutex, unsigned timeout_ms) noexcept { + bool timed_wait(PosixMutex &mutex, long timeout_us) noexcept { struct timeval now; gettimeofday(&now, nullptr); struct timespec ts; - ts.tv_sec = now.tv_sec + timeout_ms / 1000; - ts.tv_nsec = (now.tv_usec + (timeout_ms % 1000) * 1000) * 1000; + ts.tv_sec = now.tv_sec + timeout_us / 1000000; + ts.tv_nsec = (now.tv_usec + (timeout_us % 1000000)) * 1000; // Keep tv_nsec < 1E9 to prevent return of EINVAL if (ts.tv_nsec >= 1000000000) { ts.tv_nsec -= 1000000000; @@ -94,13 +94,13 @@ private: public: bool timed_wait(PosixMutex &mutex, std::chrono::steady_clock::duration timeout) noexcept { - auto timeout_ms = std::chrono::duration_cast<std::chrono::milliseconds>(timeout).count(); - if (timeout_ms < 0) - timeout_ms = 0; - else if (timeout_ms > std::numeric_limits<unsigned>::max()) - timeout_ms = std::numeric_limits<unsigned>::max(); + auto timeout_us = std::chrono::duration_cast<std::chrono::microseconds>(timeout).count(); + if (timeout_us < 0) + timeout_us = 0; + else if (timeout_us > std::numeric_limits<long>::max()) + timeout_us = std::numeric_limits<long>::max(); - return timed_wait(mutex, timeout_ms); + return timed_wait(mutex, timeout_us); } }; |