diff options
Diffstat (limited to 'src/thread/pthread_mutexattr_setrobust.c')
-rw-r--r-- | src/thread/pthread_mutexattr_setrobust.c | 22 |
1 files changed, 22 insertions, 0 deletions
diff --git a/src/thread/pthread_mutexattr_setrobust.c b/src/thread/pthread_mutexattr_setrobust.c index dcfa4cf1..8948cbaf 100644 --- a/src/thread/pthread_mutexattr_setrobust.c +++ b/src/thread/pthread_mutexattr_setrobust.c @@ -1,4 +1,26 @@ #include "pthread_impl.h" +#include <stddef.h> + +void __do_private_robust_list() +{ + pthread_t self = __pthread_self(); + void **p, **prev, **next; + pthread_mutex_t *m; + + for (prev=0, p=self->robust_list.head; p; p=next) { + next = *p; + m = (void *)((char *)p - offsetof(pthread_mutex_t, _m_next)); + if (!(m->_m_type & 128)) { + int waiters = m->_m_waiters; + if (prev) *prev = next; + else self->robust_list.head = next; + int cont = a_swap(&m->_m_lock, self->tid|0x40000000); + if (cont < 0 || waiters) __wake(&m->_m_lock, 1, 1); + } else { + prev = p; + } + } +} int pthread_mutexattr_setrobust(pthread_mutexattr_t *a, int robust) { |