OSDN Git Service

fix error in constraints for static link libc init barrier
[android-x86/external-musl-libc.git] / src / thread / pthread_mutexattr_setrobust.c
index d062788..04db92a 100644 (file)
@@ -1,33 +1,25 @@
 #include "pthread_impl.h"
-#include <stddef.h>
+#include "syscall.h"
 
-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;
+static pthread_once_t check_robust_once;
+static int check_robust_result;
 
-       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;
-               }
-       }
+static void check_robust()
+{
+       void *p;
+       size_t l;
+       check_robust_result = -__syscall(SYS_get_robust_list, 0, &p, &l);
 }
 
 int pthread_mutexattr_setrobust(pthread_mutexattr_t *a, int robust)
 {
        if (robust > 1U) return EINVAL;
+       if (robust) {
+               pthread_once(&check_robust_once, check_robust);
+               if (check_robust_result) return check_robust_result;
+               a->__attr |= 4;
+               return 0;
+       }
        a->__attr &= ~4;
-       a->__attr |= robust*4;
        return 0;
 }