clean up handling of thread/nothread mode, locking
authorRich Felker <dalias@aerifal.cx>
Sun, 17 Apr 2011 20:53:54 +0000 (16:53 -0400)
committerRich Felker <dalias@aerifal.cx>
Sun, 17 Apr 2011 20:53:54 +0000 (16:53 -0400)
src/internal/libc.h
src/internal/stdio_impl.h
src/process/fork.c
src/stdio/flockfile.c
src/stdio/ftrylockfile.c
src/thread/cancel_impl.c
src/thread/pthread_create.c
src/thread/pthread_setcancelstate.c

index d6df93d..06ba73e 100644 (file)
@@ -7,8 +7,8 @@
 struct __libc {
        int *(*errno_location)(void);
        void (*testcancel)(void);
 struct __libc {
        int *(*errno_location)(void);
        void (*testcancel)(void);
-       void (*lock)(volatile int *);
-       void (*lockfile)(FILE *);
+       int threaded;
+       int canceldisable;
        void (*fork_handler)(int);
        int (*atexit)(void (*)(void));
        void (*fini)(void);
        void (*fork_handler)(int);
        int (*atexit)(void (*)(void));
        void (*fini)(void);
@@ -16,7 +16,6 @@ struct __libc {
        volatile int threads_minus_1;
        int ofl_lock;
        FILE *ofl_head;
        volatile int threads_minus_1;
        int ofl_lock;
        FILE *ofl_head;
-       int canceldisable;
 };
 
 
 };
 
 
@@ -40,7 +39,7 @@ extern struct __libc *__libc_loc(void) __attribute__((const));
 void __lock(volatile int *);
 void __lockfile(FILE *);
 #define LOCK(x) (libc.threads_minus_1 ? (__lock(x),1) : ((void)(x),1))
 void __lock(volatile int *);
 void __lockfile(FILE *);
 #define LOCK(x) (libc.threads_minus_1 ? (__lock(x),1) : ((void)(x),1))
-#define UNLOCK(x) (*(x)=0)
+#define UNLOCK(x) (*(volatile int *)(x)=0)
 
 int __rsyscall(int, long, long, long, long, long, long);
 
 
 int __rsyscall(int, long, long, long, long, long, long);
 
index 90a8214..76b58be 100644 (file)
@@ -24,7 +24,7 @@
 
 #define UNGET 8
 
 
 #define UNGET 8
 
-#define FLOCK(f) ((libc.lockfile && (f)->lock>=0) ? (libc.lockfile((f)),0) : 0)
+#define FLOCK(f) ((libc.threads_minus_1 && (f)->lock>=0) ? (__lockfile((f)),0) : 0)
 #define FUNLOCK(f) ((f)->lockcount && (--(f)->lockcount || ((f)->lock=0)))
 
 #define F_PERM 1
 #define FUNLOCK(f) ((f)->lockcount && (--(f)->lockcount || ((f)->lock=0)))
 
 #define F_PERM 1
index 07fb79e..bcd47c9 100644 (file)
@@ -8,7 +8,7 @@ pid_t fork(void)
        pid_t ret;
        if (libc.fork_handler) libc.fork_handler(-1);
        ret = syscall(SYS_fork);
        pid_t ret;
        if (libc.fork_handler) libc.fork_handler(-1);
        ret = syscall(SYS_fork);
-       if (libc.lock && !ret) {
+       if (libc.threaded && !ret) {
                pthread_t self = __pthread_self();
                self->tid = self->pid = syscall(SYS_getpid);
                libc.threads_minus_1 = 0;
                pthread_t self = __pthread_self();
                self->tid = self->pid = syscall(SYS_getpid);
                libc.threads_minus_1 = 0;
index 440a36a..0d4c92c 100644 (file)
@@ -3,9 +3,6 @@
 
 void flockfile(FILE *f)
 {
 
 void flockfile(FILE *f)
 {
-       if (!libc.lockfile) {
-               pthread_self();
-               libc.lockfile = __lockfile;
-       }
+       if (!libc.threaded) pthread_self();
        __lockfile(f);
 }
        __lockfile(f);
 }
index 67f4b6a..0b0e44a 100644 (file)
@@ -4,7 +4,6 @@
 int ftrylockfile(FILE *f)
 {
        int tid = pthread_self()->tid;
 int ftrylockfile(FILE *f)
 {
        int tid = pthread_self()->tid;
-       if (!libc.lockfile) libc.lockfile = __lockfile;
        if (f->lock == tid) {
                if (f->lockcount == INT_MAX)
                        return -1;
        if (f->lock == tid) {
                if (f->lockcount == INT_MAX)
                        return -1;
index 2d2bb57..1f4ff90 100644 (file)
@@ -17,7 +17,7 @@ long (__syscall_cp)(long nr, long u, long v, long w, long x, long y, long z)
        uintptr_t old_sp, old_ip;
        long r;
 
        uintptr_t old_sp, old_ip;
        long r;
 
-       if (!libc.lock || (self = __pthread_self())->canceldisable)
+       if (!libc.threaded || (self = __pthread_self())->canceldisable)
                return __syscall(nr, u, v, w, x, y, z);
 
        old_sp = self->cp_sp;
                return __syscall(nr, u, v, w, x, y, z);
 
        old_sp = self->cp_sp;
index 844d7bf..8e3a4a2 100644 (file)
@@ -44,18 +44,6 @@ void __pthread_unwind_next(struct __ptcb *cb)
        __syscall(SYS_exit, 0);
 }
 
        __syscall(SYS_exit, 0);
 }
 
-static void init_threads()
-{
-       sigset_t set;
-       libc.lock = __lock;
-       libc.lockfile = __lockfile;
-
-       sigemptyset(&set);
-       sigaddset(&set, SIGSYSCALL);
-       sigaddset(&set, SIGCANCEL);
-       __libc_sigprocmask(SIG_UNBLOCK, &set, 0);
-}
-
 static int start(void *p)
 {
        struct pthread *self = p;
 static int start(void *p)
 {
        struct pthread *self = p;
@@ -79,7 +67,6 @@ weak_alias(dummy, __pthread_tsd_size);
 
 int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(void *), void *arg)
 {
 
 int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(void *), void *arg)
 {
-       static int init;
        int ret;
        size_t size, guard;
        struct pthread *self = pthread_self(), *new;
        int ret;
        size_t size, guard;
        struct pthread *self = pthread_self(), *new;
@@ -87,7 +74,14 @@ int pthread_create(pthread_t *res, const pthread_attr_t *attr, void *(*entry)(vo
        const pthread_attr_t default_attr = { 0 };
 
        if (!self) return ENOSYS;
        const pthread_attr_t default_attr = { 0 };
 
        if (!self) return ENOSYS;
-       if (!init && ++init) init_threads();
+       if (!libc.threaded) {
+               sigset_t set;
+               sigemptyset(&set);
+               sigaddset(&set, SIGSYSCALL);
+               sigaddset(&set, SIGCANCEL);
+               __libc_sigprocmask(SIG_UNBLOCK, &set, 0);
+               libc.threaded = 1;
+       }
 
        if (!attr) attr = &default_attr;
        guard = ROUND(attr->_a_guardsize + DEFAULT_GUARD_SIZE);
 
        if (!attr) attr = &default_attr;
        guard = ROUND(attr->_a_guardsize + DEFAULT_GUARD_SIZE);
index 6722541..ebb6eba 100644 (file)
@@ -3,7 +3,7 @@
 int pthread_setcancelstate(int new, int *old)
 {
        if (new > 1U) return EINVAL;
 int pthread_setcancelstate(int new, int *old)
 {
        if (new > 1U) return EINVAL;
-       if (libc.lock) {
+       if (libc.threaded) {
                struct pthread *self = __pthread_self();
                if (old) *old = self->canceldisable;
                self->canceldisable = new;
                struct pthread *self = __pthread_self();
                if (old) *old = self->canceldisable;
                self->canceldisable = new;