mirror of
git://git.musl-libc.org/musl
synced 2024-12-17 12:14:42 +00:00
add C11 mutex functions
This commit is contained in:
parent
e16f70f452
commit
8b0472932c
5
src/thread/mtx_destroy.c
Normal file
5
src/thread/mtx_destroy.c
Normal file
@ -0,0 +1,5 @@
|
||||
#include <threads.h>
|
||||
|
||||
void mtx_destroy(mtx_t *mtx)
|
||||
{
|
||||
}
|
10
src/thread/mtx_init.c
Normal file
10
src/thread/mtx_init.c
Normal file
@ -0,0 +1,10 @@
|
||||
#include "pthread_impl.h"
|
||||
#include <threads.h>
|
||||
|
||||
int mtx_init(mtx_t *m, int type)
|
||||
{
|
||||
*m = (mtx_t){
|
||||
._m_type = ((type&mtx_recursive) ? PTHREAD_MUTEX_RECURSIVE : PTHREAD_MUTEX_NORMAL),
|
||||
};
|
||||
return thrd_success;
|
||||
}
|
12
src/thread/mtx_lock.c
Normal file
12
src/thread/mtx_lock.c
Normal file
@ -0,0 +1,12 @@
|
||||
#include "pthread_impl.h"
|
||||
#include <threads.h>
|
||||
|
||||
int mtx_lock(mtx_t *m)
|
||||
{
|
||||
if (m->_m_type == PTHREAD_MUTEX_NORMAL && !a_cas(&m->_m_lock, 0, EBUSY))
|
||||
return thrd_success;
|
||||
/* Calling mtx_timedlock with a null pointer is an extension.
|
||||
* It is convenient, here to avoid duplication of the logic
|
||||
* for return values. */
|
||||
return mtx_timedlock(m, 0);
|
||||
}
|
14
src/thread/mtx_timedlock.c
Normal file
14
src/thread/mtx_timedlock.c
Normal file
@ -0,0 +1,14 @@
|
||||
#include <threads.h>
|
||||
#include <errno.h>
|
||||
|
||||
int __pthread_mutex_timedlock(mtx_t *restrict, const struct timespec *restrict);
|
||||
|
||||
int mtx_timedlock(mtx_t *restrict m, const struct timespec *restrict ts)
|
||||
{
|
||||
int ret = __pthread_mutex_timedlock(m, ts);
|
||||
switch (ret) {
|
||||
default: return thrd_error;
|
||||
case 0: return thrd_success;
|
||||
case ETIMEDOUT: return thrd_timedout;
|
||||
}
|
||||
}
|
17
src/thread/mtx_trylock.c
Normal file
17
src/thread/mtx_trylock.c
Normal file
@ -0,0 +1,17 @@
|
||||
#include "pthread_impl.h"
|
||||
#include <threads.h>
|
||||
|
||||
int __pthread_mutex_trylock(mtx_t *);
|
||||
|
||||
int mtx_trylock(mtx_t *m)
|
||||
{
|
||||
if (m->_m_type == PTHREAD_MUTEX_NORMAL)
|
||||
return (a_cas(&m->_m_lock, 0, EBUSY) & EBUSY) ? thrd_busy : thrd_success;
|
||||
|
||||
int ret = __pthread_mutex_trylock(m);
|
||||
switch (ret) {
|
||||
default: return thrd_error;
|
||||
case 0: return thrd_success;
|
||||
case EBUSY: return thrd_busy;
|
||||
}
|
||||
}
|
11
src/thread/mtx_unlock.c
Normal file
11
src/thread/mtx_unlock.c
Normal file
@ -0,0 +1,11 @@
|
||||
#include <threads.h>
|
||||
|
||||
int __pthread_mutex_unlock(mtx_t *);
|
||||
|
||||
int mtx_unlock(mtx_t *mtx)
|
||||
{
|
||||
/* The only cases where pthread_mutex_unlock can return an
|
||||
* error are undefined behavior for C11 mtx_unlock, so we can
|
||||
* assume it does not return an error and simply tail call. */
|
||||
return __pthread_mutex_unlock(mtx);
|
||||
}
|
Loading…
Reference in New Issue
Block a user