blob: 997ef62351a88b5faa2e589d961fd40b7542ace6 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
|
#include "config.h"
#include <errno.h>
#define _x_min(a, b) ((a) < (b) ? (a) : (b))
int xine_private_pthread_mutex_timedlock(pthread_mutex_t *mutex,
const struct timespec *abs_timeout)
{
int pthread_rc;
struct timespec remaining, slept, ts;
remaining = *abs_timeout;
while ((pthread_rc = pthread_mutex_trylock(mutex)) == EBUSY) {
ts.tv_sec = 0;
ts.tv_nsec = (remaining.tv_sec > 0 ? 10000000
: _x_min(remaining.tv_nsec, 10000000));
nanosleep(&ts, &slept);
ts.tv_nsec -= slept.tv_nsec;
if (ts.tv_nsec <= remaining.tv_nsec) {
remaining.tv_nsec -= ts.tv_nsec;
}
else {
remaining.tv_sec--;
remaining.tv_nsec = (1000000 - (ts.tv_nsec - remaining.tv_nsec));
}
if (remaining.tv_sec < 0 || (!remaining.tv_sec && remaining.tv_nsec <= 0)) {
return ETIMEDOUT;
}
}
return pthread_rc;
}
|