c++ seems to want some casts in the float representation-access macros
[musl] / src / ldso / dynlink.c
index 01c7f29..6ff8850 100644 (file)
@@ -47,9 +47,9 @@ struct dso
        size_t map_len;
        dev_t dev;
        ino_t ino;
-       int global;
-       int relocated;
-       int constructed;
+       char global;
+       char relocated;
+       char constructed;
        struct dso **deps;
        char *name;
        char buf[];
@@ -610,9 +610,11 @@ void *dlopen(const char *file, int mode)
 {
        struct dso *volatile p, *orig_tail = tail, *next;
        size_t i;
+       int cs;
 
        if (!file) return head;
 
+       pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs);
        pthread_rwlock_wrlock(&lock);
 
        if (setjmp(rtld_fail)) {
@@ -628,8 +630,8 @@ void *dlopen(const char *file, int mode)
                }
                tail = orig_tail;
                tail->next = 0;
-               pthread_rwlock_unlock(&lock);
-               return 0;
+               p = 0;
+               goto end;
        }
 
        p = load_library(file);
@@ -658,6 +660,7 @@ void *dlopen(const char *file, int mode)
        do_init_fini(tail);
 end:
        pthread_rwlock_unlock(&lock);
+       pthread_setcancelstate(cs, 0);
        return p;
 }