diff options
-rw-r--r-- | src/dirent/__dirent.h | 2 | ||||
-rw-r--r-- | src/dirent/readdir.c | 5 | ||||
-rw-r--r-- | src/dirent/readdir_r.c | 6 | ||||
-rw-r--r-- | src/dirent/rewinddir.c | 4 | ||||
-rw-r--r-- | src/dirent/seekdir.c | 4 | ||||
-rw-r--r-- | src/exit/atexit.c | 14 | ||||
-rw-r--r-- | src/exit/exit.c | 4 | ||||
-rw-r--r-- | src/internal/libc.h | 2 | ||||
-rw-r--r-- | src/internal/stdio_impl.h | 4 | ||||
-rw-r--r-- | src/malloc/lite_malloc.c | 8 | ||||
-rw-r--r-- | src/misc/syslog.c | 18 | ||||
-rw-r--r-- | src/prng/random.c | 18 | ||||
-rw-r--r-- | src/thread/__lock.c | 26 | ||||
-rw-r--r-- | src/thread/pthread_atfork.c | 10 | ||||
-rw-r--r-- | src/time/tzset.c | 6 |
15 files changed, 54 insertions, 77 deletions
diff --git a/src/dirent/__dirent.h b/src/dirent/__dirent.h index 07b3ee68..38a27b06 100644 --- a/src/dirent/__dirent.h +++ b/src/dirent/__dirent.h @@ -1,9 +1,9 @@ struct __DIR_s { - int lock; int fd; off_t tell; int buf_pos; int buf_end; + int lock[2]; char buf[2048]; }; diff --git a/src/dirent/readdir.c b/src/dirent/readdir.c index 1aeb25a5..2d27d29a 100644 --- a/src/dirent/readdir.c +++ b/src/dirent/readdir.c @@ -16,10 +16,7 @@ struct dirent *readdir(DIR *dir) if (dir->buf_pos >= dir->buf_end) { int len = __getdents(dir->fd, (void *)dir->buf, sizeof dir->buf); - if (len < 0) { - dir->lock = 0; - return NULL; - } else if (len == 0) return 0; + if (len <= 0) return 0; dir->buf_end = len; dir->buf_pos = 0; } diff --git a/src/dirent/readdir_r.c b/src/dirent/readdir_r.c index 58f60325..d3d7c608 100644 --- a/src/dirent/readdir_r.c +++ b/src/dirent/readdir_r.c @@ -11,18 +11,18 @@ int readdir_r(DIR *dir, struct dirent *buf, struct dirent **result) int errno_save = errno; int ret; - LOCK(&dir->lock); + LOCK(dir->lock); errno = 0; de = readdir(dir); if ((ret = errno)) { - UNLOCK(&dir->lock); + UNLOCK(dir->lock); return ret; } errno = errno_save; if (de) memcpy(buf, de, de->d_reclen); else buf = NULL; - UNLOCK(&dir->lock); + UNLOCK(dir->lock); *result = buf; return 0; } diff --git a/src/dirent/rewinddir.c b/src/dirent/rewinddir.c index c6138f7c..f2053008 100644 --- a/src/dirent/rewinddir.c +++ b/src/dirent/rewinddir.c @@ -5,9 +5,9 @@ void rewinddir(DIR *dir) { - LOCK(&dir->lock); + LOCK(dir->lock); lseek(dir->fd, 0, SEEK_SET); dir->buf_pos = dir->buf_end = 0; dir->tell = 0; - UNLOCK(&dir->lock); + UNLOCK(dir->lock); } diff --git a/src/dirent/seekdir.c b/src/dirent/seekdir.c index 81a0e331..5be47d4a 100644 --- a/src/dirent/seekdir.c +++ b/src/dirent/seekdir.c @@ -5,8 +5,8 @@ void seekdir(DIR *dir, long off) { - LOCK(&dir->lock); + LOCK(dir->lock); dir->tell = lseek(dir->fd, off, SEEK_SET); dir->buf_pos = dir->buf_end = 0; - UNLOCK(&dir->lock); + UNLOCK(dir->lock); } diff --git a/src/exit/atexit.c b/src/exit/atexit.c index 9d9c2fbe..1b40cb9b 100644 --- a/src/exit/atexit.c +++ b/src/exit/atexit.c @@ -14,22 +14,22 @@ static struct fl void *a[COUNT]; } builtin, *head; -static int lock; +static int lock[2]; void __funcs_on_exit() { int i; void (*func)(void *), *arg; - LOCK(&lock); + LOCK(lock); for (; head; head=head->next) { for (i=COUNT-1; i>=0 && !head->f[i]; i--); if (i<0) continue; func = head->f[i]; arg = head->a[i]; head->f[i] = 0; - UNLOCK(&lock); + UNLOCK(lock); func(arg); - LOCK(&lock); + LOCK(lock); } } @@ -41,7 +41,7 @@ int __cxa_atexit(void (*func)(void *), void *arg, void *dso) { int i; - LOCK(&lock); + LOCK(lock); /* Defer initialization of head so it can be in BSS */ if (!head) head = &builtin; @@ -50,7 +50,7 @@ int __cxa_atexit(void (*func)(void *), void *arg, void *dso) if (head->f[COUNT-1]) { struct fl *new_fl = calloc(sizeof(struct fl), 1); if (!new_fl) { - UNLOCK(&lock); + UNLOCK(lock); return -1; } new_fl->next = head; @@ -62,7 +62,7 @@ int __cxa_atexit(void (*func)(void *), void *arg, void *dso) head->f[i] = func; head->a[i] = arg; - UNLOCK(&lock); + UNLOCK(lock); return 0; } diff --git a/src/exit/exit.c b/src/exit/exit.c index 1ff19dbe..ae557c09 100644 --- a/src/exit/exit.c +++ b/src/exit/exit.c @@ -13,10 +13,10 @@ weak_alias(dummy, __fflush_on_exit); void exit(int code) { - static int lock; + static int lock[2]; /* If more than one thread calls exit, hang until _Exit ends it all */ - LOCK(&lock); + LOCK(lock); /* Only do atexit & stdio flush if they were actually used */ __funcs_on_exit(); diff --git a/src/internal/libc.h b/src/internal/libc.h index d6797f90..78fca47f 100644 --- a/src/internal/libc.h +++ b/src/internal/libc.h @@ -15,7 +15,7 @@ struct __libc { volatile int threads_minus_1; int canceldisable; FILE *ofl_head; - int ofl_lock; + int ofl_lock[2]; }; diff --git a/src/internal/stdio_impl.h b/src/internal/stdio_impl.h index af7aacc8..a1f31b3c 100644 --- a/src/internal/stdio_impl.h +++ b/src/internal/stdio_impl.h @@ -88,8 +88,8 @@ int __putc_unlocked(int, FILE *); FILE *__fdopen(int, const char *); -#define OFLLOCK() LOCK(&libc.ofl_lock) -#define OFLUNLOCK() UNLOCK(&libc.ofl_lock) +#define OFLLOCK() LOCK(libc.ofl_lock) +#define OFLUNLOCK() UNLOCK(libc.ofl_lock) #define feof(f) ((f)->flags & F_EOF) #define ferror(f) ((f)->flags & F_ERR) diff --git a/src/malloc/lite_malloc.c b/src/malloc/lite_malloc.c index c8293908..673966a1 100644 --- a/src/malloc/lite_malloc.c +++ b/src/malloc/lite_malloc.c @@ -12,7 +12,7 @@ void *__simple_malloc(size_t n) { static uintptr_t cur, brk; uintptr_t base, new; - static int lock; + static int lock[2]; size_t align=1; if (!n) n++; @@ -22,7 +22,7 @@ void *__simple_malloc(size_t n) align += align; n = n + align - 1 & -align; - LOCK(&lock); + LOCK(lock); if (!cur) cur = brk = __brk(0)+16; base = cur + align-1 & -align; if (n > SIZE_MAX - PAGE_SIZE - base) goto fail; @@ -32,12 +32,12 @@ void *__simple_malloc(size_t n) brk = new; } cur = base+n; - UNLOCK(&lock); + UNLOCK(lock); return (void *)base; fail: - UNLOCK(&lock); + UNLOCK(lock); toobig: errno = ENOMEM; return 0; diff --git a/src/misc/syslog.c b/src/misc/syslog.c index cbe65209..a4f36dee 100644 --- a/src/misc/syslog.c +++ b/src/misc/syslog.c @@ -10,7 +10,7 @@ #include <pthread.h> #include "libc.h" -static int lock; +static int lock[2]; static const char *log_ident; static int log_opt; static int log_facility = LOG_USER; @@ -36,10 +36,10 @@ void closelog(void) { int cs; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); - LOCK(&lock); + LOCK(lock); close(log_fd); log_fd = -1; - UNLOCK(&lock); + UNLOCK(lock); pthread_setcancelstate(cs, 0); } @@ -59,9 +59,9 @@ void openlog(const char *ident, int opt, int facility) { int cs; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); - LOCK(&lock); + LOCK(lock); __openlog(ident, opt, facility); - UNLOCK(&lock); + UNLOCK(lock); pthread_setcancelstate(cs, 0); } @@ -77,7 +77,7 @@ static void _vsyslog(int priority, const char *message, va_list ap) if (log_fd < 0) { __openlog(log_ident, log_opt | LOG_NDELAY, log_facility); if (log_fd < 0) { - UNLOCK(&lock); + UNLOCK(lock); return; } } @@ -98,7 +98,7 @@ static void _vsyslog(int priority, const char *message, va_list ap) sendto(log_fd, buf, l, 0, (void *)&log_addr, 11); } - UNLOCK(&lock); + UNLOCK(lock); } void __vsyslog(int priority, const char *message, va_list ap) @@ -106,9 +106,9 @@ void __vsyslog(int priority, const char *message, va_list ap) int cs; if (!(log_mask & LOG_MASK(priority&7)) || (priority&~0x3ff)) return; pthread_setcancelstate(PTHREAD_CANCEL_DISABLE, &cs); - LOCK(&lock); + LOCK(lock); _vsyslog(priority, message, ap); - UNLOCK(&lock); + UNLOCK(lock); pthread_setcancelstate(cs, 0); } diff --git a/src/prng/random.c b/src/prng/random.c index cc5702ed..4ad62058 100644 --- a/src/prng/random.c +++ b/src/prng/random.c @@ -33,7 +33,7 @@ static int n = 31; static int i = 3; static int j = 0; static uint32_t *x = init+1; -static int lock; +static int lock[2]; static uint32_t lcg31(uint32_t x) { return (1103515245*x + 12345) & 0x7fffffff; @@ -74,9 +74,9 @@ static void __srandom(unsigned seed) { } void srandom(unsigned seed) { - LOCK(&lock); + LOCK(lock); __srandom(seed); - UNLOCK(&lock); + UNLOCK(lock); } char *initstate(unsigned seed, char *state, size_t size) { @@ -84,7 +84,7 @@ char *initstate(unsigned seed, char *state, size_t size) { if (size < 8) return 0; - LOCK(&lock); + LOCK(lock); old = savestate(); if (size < 32) n = 0; @@ -98,24 +98,24 @@ char *initstate(unsigned seed, char *state, size_t size) { n = 63; x = (uint32_t*)state + 1; __srandom(seed); - UNLOCK(&lock); + UNLOCK(lock); return old; } char *setstate(char *state) { void *old; - LOCK(&lock); + LOCK(lock); old = savestate(); loadstate((uint32_t*)state); - UNLOCK(&lock); + UNLOCK(lock); return old; } long random(void) { long k; - LOCK(&lock); + LOCK(lock); if (n == 0) { k = x[0] = lcg31(x[0]); goto end; @@ -127,6 +127,6 @@ long random(void) { if (++j == n) j = 0; end: - UNLOCK(&lock); + UNLOCK(lock); return k; } diff --git a/src/thread/__lock.c b/src/thread/__lock.c index 5ba5dc5e..2f345ae7 100644 --- a/src/thread/__lock.c +++ b/src/thread/__lock.c @@ -1,32 +1,12 @@ #include "pthread_impl.h" -void __lock_2(volatile int *l) -{ - if (!__syscall(SYS_futex, l, FUTEX_LOCK_PI, 0, 0)) - return; - int old, tid = __pthread_self()->tid|INT_MIN; - while ((old = a_cas(l, 0, tid))) { - a_cas(l, old, old|INT_MIN); - __syscall(SYS_futex, l, FUTEX_WAIT, old|INT_MIN, 0); - } -} - void __lock(volatile int *l) { - if (a_cas(l, 0, __pthread_self()->tid)) __lock_2(l); -} - -void __unlock_2(volatile int *l) -{ - if (__syscall(SYS_futex, l, FUTEX_UNLOCK_PI)) { - *l = 0; - __syscall(SYS_futex, l, FUTEX_WAKE, 1); - } + while (a_swap(l, 1)) __wait(l, l+1, 1, 1); } void __unlock(volatile int *l) { - int old = *l; - if (!(old & INT_MIN) && a_cas(l, old, 0)==old) return; - __unlock_2(l); + a_store(l, 0); + if (l[1]) __wake(l, 1, 1); } diff --git a/src/thread/pthread_atfork.c b/src/thread/pthread_atfork.c index a7a82016..95fce207 100644 --- a/src/thread/pthread_atfork.c +++ b/src/thread/pthread_atfork.c @@ -8,14 +8,14 @@ static struct atfork_funcs { struct atfork_funcs *prev, *next; } *funcs; -static int lock; +static int lock[2]; void __fork_handler(int who) { struct atfork_funcs *p; if (!funcs) return; if (who < 0) { - LOCK(&lock); + LOCK(lock); for (p=funcs; p; p = p->next) { if (p->prepare) p->prepare(); funcs = p; @@ -26,7 +26,7 @@ void __fork_handler(int who) else if (who && p->child) p->child(); funcs = p; } - UNLOCK(&lock); + UNLOCK(lock); } } @@ -35,7 +35,7 @@ int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(vo struct atfork_funcs *new = malloc(sizeof *new); if (!new) return -1; - LOCK(&lock); + LOCK(lock); new->next = funcs; new->prev = 0; new->prepare = prepare; @@ -43,6 +43,6 @@ int pthread_atfork(void (*prepare)(void), void (*parent)(void), void (*child)(vo new->child = child; if (funcs) funcs->prev = new; funcs = new; - UNLOCK(&lock); + UNLOCK(lock); return 0; } diff --git a/src/time/tzset.c b/src/time/tzset.c index 0cd47cf2..7e836c2f 100644 --- a/src/time/tzset.c +++ b/src/time/tzset.c @@ -106,12 +106,12 @@ void tzset(void) void __tzset(void) { - static int lock, init; + static int lock[2], init; if (init) return; - LOCK(&lock); + LOCK(lock); if (!init) tzset(); init=1; - UNLOCK(&lock); + UNLOCK(lock); } static int is_leap(int year) |