libc: pthread: implement mutexes

This commit is contained in:
2026-07-19 13:31:22 +01:00
parent 6317060138
commit 810f741442
4 changed files with 57 additions and 1 deletions
+6
View File
@@ -5,6 +5,8 @@
#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;
typedef struct __pthread_attr { typedef struct __pthread_attr {
@@ -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);
}