diff options
author | Kacper Michajłow <kasper93@gmail.com> | 2023-10-22 07:33:19 +0200 |
---|---|---|
committer | Dudemanguy <random342@airmail.cc> | 2023-10-26 20:06:14 +0000 |
commit | 729f2fed2ce1d00df7b14983bfe0c761d1dff51e (patch) | |
tree | 5e44e18f2b8e7f08c13325fa51c35f9999fb9ff5 /osdep/semaphore_osx.c | |
parent | f659a60dfa07664ba9a754619dbac13f5f0c7000 (diff) | |
download | mpv-729f2fed2ce1d00df7b14983bfe0c761d1dff51e.tar.bz2 mpv-729f2fed2ce1d00df7b14983bfe0c761d1dff51e.tar.xz |
semaphore_osx: change mp_sem_timedwait to mp_time
Diffstat (limited to 'osdep/semaphore_osx.c')
-rw-r--r-- | osdep/semaphore_osx.c | 36 |
1 files changed, 15 insertions, 21 deletions
diff --git a/osdep/semaphore_osx.c b/osdep/semaphore_osx.c index 1e2015bddd..e8ba7b72b5 100644 --- a/osdep/semaphore_osx.c +++ b/osdep/semaphore_osx.c @@ -23,7 +23,9 @@ #include <sys/time.h> #include <errno.h> -#include "osdep/io.h" +#include <common/common.h> +#include "io.h" +#include "timer.h" int mp_sem_init(mp_sem_t *sem, int pshared, unsigned int value) { @@ -44,7 +46,7 @@ int mp_sem_init(mp_sem_t *sem, int pshared, unsigned int value) int mp_sem_wait(mp_sem_t *sem) { - return mp_sem_timedwait(sem, NULL); + return mp_sem_timedwait(sem, MP_START_TIME - 1); } int mp_sem_trywait(mp_sem_t *sem) @@ -67,32 +69,24 @@ int mp_sem_trywait(mp_sem_t *sem) return r; } -int mp_sem_timedwait(mp_sem_t *sem, const struct timespec *abs_timeout) +int mp_sem_timedwait(mp_sem_t *sem, int64_t until) { while (1) { if (!mp_sem_trywait(sem)) return 0; - int timeout_ms = -1; - if (abs_timeout) { - timeout_ms = 0; - - // OSX does not provide clock_gettime() either. - struct timeval tv; - gettimeofday(&tv, NULL); - - if (abs_timeout->tv_sec >= tv.tv_sec) { - long long msec = (abs_timeout->tv_sec - tv.tv_sec) * 1000LL + - abs_timeout->tv_nsec / 1000LL / 1000LL - tv.tv_usec / 1000LL; - if (msec > INT_MAX) - msec = INT_MAX; - if (msec < 0) - msec = 0; - timeout_ms = msec; - } + int timeout = 0; + if (until == MP_START_TIME - 1) { + timeout = -1; + } else if (until >= MP_START_TIME) { + timeout = (until - mp_time_ns()) / MP_TIME_MS_TO_NS(1); + timeout = MPCLAMP(timeout, 0, INT_MAX); + } else { + assert(false && "Invalid mp_time value!"); } + struct pollfd fd = {.fd = sem->wakeup_pipe[0], .events = POLLIN}; - int r = poll(&fd, 1, timeout_ms); + int r = poll(&fd, 1, timeout); if (r < 0) return -1; if (r == 0) { |