diff options
author | "Steven J. Hill" <sjhill@realitydiluted.com> | 2005-07-22 05:47:17 +0000 |
---|---|---|
committer | "Steven J. Hill" <sjhill@realitydiluted.com> | 2005-07-22 05:47:17 +0000 |
commit | 9a97faafbcd7bc23d5adf32f4ed135bdf623629a (patch) | |
tree | d20e2fba0f9fce0ae5f30490d01e61da3725dcc6 /libc/stdio/_stdio.c | |
parent | eb6ed4fe445d1d604a6deab019d547f78540127e (diff) | |
download | uClibc-alpine-9a97faafbcd7bc23d5adf32f4ed135bdf623629a.tar.bz2 uClibc-alpine-9a97faafbcd7bc23d5adf32f4ed135bdf623629a.tar.xz |
Add futex support into uClibc. Selection of futex support independent of
NPTL is not currently supported.
Diffstat (limited to 'libc/stdio/_stdio.c')
-rw-r--r-- | libc/stdio/_stdio.c | 20 |
1 files changed, 20 insertions, 0 deletions
diff --git a/libc/stdio/_stdio.c b/libc/stdio/_stdio.c index 4aae3c418..671f1e14c 100644 --- a/libc/stdio/_stdio.c +++ b/libc/stdio/_stdio.c @@ -73,8 +73,13 @@ #endif #ifdef __UCLIBC_HAS_THREADS__ +#ifdef __UCLIBC_HAS_FUTEXES__ +#define __STDIO_FILE_INIT_THREADSAFE \ + 2, _LIBC_LOCK_RECURSIVE_INITIALIZER, +#else #define __STDIO_FILE_INIT_THREADSAFE \ 2, PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP, +#endif #else #define __STDIO_FILE_INIT_THREADSAFE #endif @@ -151,7 +156,12 @@ FILE *__stdout = _stdio_streams + 1; /* For putchar() macro. */ FILE *_stdio_openlist = _stdio_streams; # ifdef __UCLIBC_HAS_THREADS__ +# ifdef __UCLIBC_HAS_FUTEXES__ +# include <bits/stdio-lock.h> +_IO_lock_t _stdio_openlist_lock = _IO_lock_initializer; +# else pthread_mutex_t _stdio_openlist_lock = PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP; +# endif int _stdio_openlist_delflag = 0; # endif @@ -162,6 +172,7 @@ int _stdio_openlist_delflag = 0; /* 2 if threading not initialized and 0 otherwise; */ int _stdio_user_locking = 2; +#ifndef __UCLIBC_HAS_FUTEXES__ void __stdio_init_mutex(pthread_mutex_t *m) { static const pthread_mutex_t __stdio_mutex_initializer @@ -169,6 +180,7 @@ void __stdio_init_mutex(pthread_mutex_t *m) memcpy(m, &__stdio_mutex_initializer, sizeof(__stdio_mutex_initializer)); } +#endif #endif /**********************************************************************/ @@ -184,7 +196,11 @@ void _stdio_term(void) * locked, then I suppose there is a chance that a pointer in the * chain might be corrupt due to a partial store. */ +#ifdef __UCLIBC_HAS_FUTEXES__ + _IO_lock_init (_stdio_openlist_lock); +#else __stdio_init_mutex(&_stdio_openlist_lock); +#endif /* Next we need to worry about the streams themselves. If a stream * is currently locked, then it may be in an invalid state. So we @@ -205,7 +221,11 @@ void _stdio_term(void) } ptr->__user_locking = 1; /* Set locking mode to "by caller". */ +#ifdef __UCLIBC_HAS_FUTEXES__ + _IO_lock_init (ptr->_lock); +#else __stdio_init_mutex(&ptr->__lock); /* Shouldn't be necessary, but... */ +#endif } #endif |