summaryrefslogtreecommitdiff
path: root/src/thread
diff options
context:
space:
mode:
authorYue Wang <Wang-Yue@users.noreply.github.com>2018-07-15 13:22:53 -0700
committerGitHub <noreply@github.com>2018-07-15 13:22:53 -0700
commit79937c9495d73539a4c6af20dc91d9cd098dd593 (patch)
tree8d3f129b08333215c4d8d54fa2d8b2800ebc9322 /src/thread
parent8aa2c574135ec147a59f36b032436fc9c6860f0c (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.hxx18
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);
}
};