use weak symbols for the POSIX functions that will be used by C threads
[musl] / src / thread / pthread_mutexattr_setrobust.c
index 8948cba..d062788 100644 (file)
@@ -4,16 +4,18 @@
 void __do_private_robust_list()
 {
        pthread_t self = __pthread_self();
-       void **p, **prev, **next;
+       volatile void *volatile *p;
+       volatile void *volatile *prev;
+       volatile void *volatile *next;
        pthread_mutex_t *m;
 
-       for (prev=0, p=self->robust_list.head; p; p=next) {
+       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;
-                       if (prev) *prev = next;
-                       else self->robust_list.head = next;
+                       *prev = next;
                        int cont = a_swap(&m->_m_lock, self->tid|0x40000000);
                        if (cont < 0 || waiters) __wake(&m->_m_lock, 1, 1);
                } else {