#include "pthread_impl.h" #include void __do_private_robust_list() { pthread_t self = __pthread_self(); volatile void *volatile *p; volatile void *volatile *prev; volatile void *volatile *next; pthread_mutex_t *m; prev = &self->robust_list.head; for (p=self->robust_list.head; p&&p!=&self->robust_list.head; p=next) { next = *p; m = (void *)((char *)p - offsetof(pthread_mutex_t, _m_next)); if (!(m->_m_type & 128)) { int waiters = m->_m_waiters; *prev = 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) { if (robust > 1U) return EINVAL; a->__attr &= ~4; a->__attr |= robust*4; return 0; }