25 lines
412 B
C
25 lines
412 B
C
|
|
#include <errno.h>
|
||
|
|
#include <magenta/futex.h>
|
||
|
|
#include <pthread.h>
|
||
|
|
|
||
|
|
int pthread_mutex_lock(pthread_mutex_t *mut)
|
||
|
|
{
|
||
|
|
kern_futex_t expected = 0;
|
||
|
|
while (1) {
|
||
|
|
expected = 0;
|
||
|
|
if (__atomic_compare_exchange_n(
|
||
|
|
&mut->__v,
|
||
|
|
&expected,
|
||
|
|
1,
|
||
|
|
0,
|
||
|
|
__ATOMIC_ACQUIRE,
|
||
|
|
__ATOMIC_ACQUIRE)) {
|
||
|
|
return 0;
|
||
|
|
}
|
||
|
|
|
||
|
|
futex_wait(&mut->__v, 1, FUTEX_PRIVATE);
|
||
|
|
}
|
||
|
|
|
||
|
|
return __set_errno(EAGAIN);
|
||
|
|
}
|