libc: pthread: implement mutexes
This commit is contained in:
@@ -3,7 +3,9 @@
|
|||||||
|
|
||||||
#include <magenta/types.h>
|
#include <magenta/types.h>
|
||||||
|
|
||||||
#define __PTHREAD_ATTR_SIZE__ 32
|
#define __PTHREAD_ATTR_SIZE__ 32
|
||||||
|
|
||||||
|
#define PTHREAD_MUTEX_INITIALIZER ((pthread_mutex_t) {.__v = 0})
|
||||||
|
|
||||||
typedef struct __pthread *pthread_t;
|
typedef struct __pthread *pthread_t;
|
||||||
|
|
||||||
@@ -28,4 +30,8 @@ extern int pthread_join(pthread_t thread, void **retval);
|
|||||||
extern int pthread_detach(pthread_t thread);
|
extern int pthread_detach(pthread_t thread);
|
||||||
extern void pthread_exit(void *retval);
|
extern void pthread_exit(void *retval);
|
||||||
|
|
||||||
|
extern int pthread_mutex_lock(pthread_mutex_t *mut);
|
||||||
|
extern int pthread_mutex_trylock(pthread_mutex_t *mut);
|
||||||
|
extern int pthread_mutex_unlock(pthread_mutex_t *mut);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|||||||
@@ -0,0 +1,24 @@
|
|||||||
|
#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);
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
#include <errno.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
int pthread_mutex_trylock(pthread_mutex_t *mut)
|
||||||
|
{
|
||||||
|
kern_futex_t expected = 0;
|
||||||
|
if (__atomic_compare_exchange_n(
|
||||||
|
&mut->__v,
|
||||||
|
&expected,
|
||||||
|
1,
|
||||||
|
0,
|
||||||
|
__ATOMIC_ACQUIRE,
|
||||||
|
__ATOMIC_ACQUIRE)) {
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
return __set_errno(EBUSY);
|
||||||
|
}
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
#include <magenta/futex.h>
|
||||||
|
#include <pthread.h>
|
||||||
|
|
||||||
|
int pthread_mutex_unlock(pthread_mutex_t *mut)
|
||||||
|
{
|
||||||
|
mut->__v = 0;
|
||||||
|
futex_wake(&mut->__v, 1, FUTEX_PRIVATE);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user