summaryrefslogtreecommitdiffstats
path: root/osdep/semaphore_osx.c
diff options
context:
space:
mode:
authorKacper Michajłow <kasper93@gmail.com>2023-10-22 07:33:19 +0200
committerDudemanguy <random342@airmail.cc>2023-10-26 20:06:14 +0000
commit729f2fed2ce1d00df7b14983bfe0c761d1dff51e (patch)
tree5e44e18f2b8e7f08c13325fa51c35f9999fb9ff5 /osdep/semaphore_osx.c
parentf659a60dfa07664ba9a754619dbac13f5f0c7000 (diff)
downloadmpv-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.c36
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) {