mirror of https://git.musl-libc.org/git/musl
committed by
Rich Felker
6 changed files with 69 additions and 0 deletions
@ -0,0 +1,5 @@ |
|||||
|
#include <threads.h> |
||||
|
|
||||
|
void mtx_destroy(mtx_t *mtx) |
||||
|
{ |
||||
|
} |
||||
@ -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; |
||||
|
} |
||||
@ -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); |
||||
|
} |
||||
@ -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; |
||||
|
} |
||||
|
} |
||||
@ -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; |
||||
|
} |
||||
|
} |
||||
@ -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