diff options
| -rw-r--r-- | src/internal/libc.h | 2 | ||||
| -rw-r--r-- | src/internal/stdio_impl.h | 5 | ||||
| -rw-r--r-- | src/stdio/__fdopen.c | 8 | ||||
| -rw-r--r-- | src/stdio/__stdio_exit.c | 3 | ||||
| -rw-r--r-- | src/stdio/fclose.c | 6 | ||||
| -rw-r--r-- | src/stdio/fflush.c | 5 | ||||
| -rw-r--r-- | src/stdio/fmemopen.c | 8 | ||||
| -rw-r--r-- | src/stdio/ofl.c | 16 | ||||
| -rw-r--r-- | src/stdio/ofl_add.c | 11 | ||||
| -rw-r--r-- | src/stdio/open_memstream.c | 8 | ||||
| -rw-r--r-- | src/stdio/open_wmemstream.c | 8 | ||||
| -rw-r--r-- | src/thread/pthread_create.c | 3 | 
12 files changed, 42 insertions, 41 deletions
diff --git a/src/internal/libc.h b/src/internal/libc.h index 6810cd8b..98c7535a 100644 --- a/src/internal/libc.h +++ b/src/internal/libc.h @@ -17,8 +17,6 @@ struct __libc {  	int secure;  	volatile int threads_minus_1;  	size_t *auxv; -	FILE *ofl_head; -	volatile int ofl_lock[2];  	size_t tls_size;  	size_t page_size;  	struct __locale_struct global_locale; diff --git a/src/internal/stdio_impl.h b/src/internal/stdio_impl.h index 72c55192..0dd7fb5e 100644 --- a/src/internal/stdio_impl.h +++ b/src/internal/stdio_impl.h @@ -76,8 +76,9 @@ int __putc_unlocked(int, FILE *);  FILE *__fdopen(int, const char *);  int __fmodeflags(const char *); -#define OFLLOCK() LOCK(libc.ofl_lock) -#define OFLUNLOCK() UNLOCK(libc.ofl_lock) +FILE *__ofl_add(FILE *f); +FILE **__ofl_lock(void); +void __ofl_unlock(void);  #define feof(f) ((f)->flags & F_EOF)  #define ferror(f) ((f)->flags & F_ERR) diff --git a/src/stdio/__fdopen.c b/src/stdio/__fdopen.c index ef8f47dc..8d6ce813 100644 --- a/src/stdio/__fdopen.c +++ b/src/stdio/__fdopen.c @@ -54,13 +54,7 @@ FILE *__fdopen(int fd, const char *mode)  	if (!libc.threaded) f->lock = -1;  	/* Add new FILE to open file list */ -	OFLLOCK(); -	f->next = libc.ofl_head; -	if (libc.ofl_head) libc.ofl_head->prev = f; -	libc.ofl_head = f; -	OFLUNLOCK(); - -	return f; +	return __ofl_add(f);  }  weak_alias(__fdopen, fdopen); diff --git a/src/stdio/__stdio_exit.c b/src/stdio/__stdio_exit.c index 716e5f73..191b4454 100644 --- a/src/stdio/__stdio_exit.c +++ b/src/stdio/__stdio_exit.c @@ -16,8 +16,7 @@ static void close_file(FILE *f)  void __stdio_exit(void)  {  	FILE *f; -	OFLLOCK(); -	for (f=libc.ofl_head; f; f=f->next) close_file(f); +	for (f=*__ofl_lock(); f; f=f->next) close_file(f);  	close_file(__stdin_used);  	close_file(__stdout_used);  } diff --git a/src/stdio/fclose.c b/src/stdio/fclose.c index 317b3c90..839d88af 100644 --- a/src/stdio/fclose.c +++ b/src/stdio/fclose.c @@ -14,11 +14,11 @@ int fclose(FILE *f)  	__unlist_locked_file(f);  	if (!(perm = f->flags & F_PERM)) { -		OFLLOCK(); +		FILE **head = __ofl_lock();  		if (f->prev) f->prev->next = f->next;  		if (f->next) f->next->prev = f->prev; -		if (libc.ofl_head == f) libc.ofl_head = f->next; -		OFLUNLOCK(); +		if (*head == f) *head = f->next; +		__ofl_unlock();  	}  	r = fflush(f); diff --git a/src/stdio/fflush.c b/src/stdio/fflush.c index 7bf862a6..3f462c80 100644 --- a/src/stdio/fflush.c +++ b/src/stdio/fflush.c @@ -35,13 +35,12 @@ int fflush(FILE *f)  	r = __stdout_used ? fflush(__stdout_used) : 0; -	OFLLOCK(); -	for (f=libc.ofl_head; f; f=f->next) { +	for (f=*__ofl_lock(); f; f=f->next) {  		FLOCK(f);  		if (f->wpos > f->wbase) r |= __fflush_unlocked(f);  		FUNLOCK(f);  	} -	OFLUNLOCK(); +	__ofl_unlock();  	return r;  } diff --git a/src/stdio/fmemopen.c b/src/stdio/fmemopen.c index d7849609..7c193a57 100644 --- a/src/stdio/fmemopen.c +++ b/src/stdio/fmemopen.c @@ -110,11 +110,5 @@ FILE *fmemopen(void *restrict buf, size_t size, const char *restrict mode)  	if (!libc.threaded) f->lock = -1; -	OFLLOCK(); -	f->next = libc.ofl_head; -	if (libc.ofl_head) libc.ofl_head->prev = f; -	libc.ofl_head = f; -	OFLUNLOCK(); - -	return f; +	return __ofl_add(f);  } diff --git a/src/stdio/ofl.c b/src/stdio/ofl.c new file mode 100644 index 00000000..b143999c --- /dev/null +++ b/src/stdio/ofl.c @@ -0,0 +1,16 @@ +#include "stdio_impl.h" +#include "libc.h" + +static FILE *ofl_head; +static volatile int ofl_lock[2]; + +FILE **__ofl_lock() +{ +	LOCK(ofl_lock); +	return &ofl_head; +} + +void __ofl_unlock() +{ +	UNLOCK(ofl_lock); +} diff --git a/src/stdio/ofl_add.c b/src/stdio/ofl_add.c new file mode 100644 index 00000000..d7de9f15 --- /dev/null +++ b/src/stdio/ofl_add.c @@ -0,0 +1,11 @@ +#include "stdio_impl.h" + +FILE *__ofl_add(FILE *f) +{ +	FILE **head = __ofl_lock(); +	f->next = *head; +	if (*head) (*head)->prev = f; +	*head = f; +	__ofl_unlock(); +	return f; +} diff --git a/src/stdio/open_memstream.c b/src/stdio/open_memstream.c index 9eafdfba..58504c9f 100644 --- a/src/stdio/open_memstream.c +++ b/src/stdio/open_memstream.c @@ -79,11 +79,5 @@ FILE *open_memstream(char **bufp, size_t *sizep)  	if (!libc.threaded) f->lock = -1; -	OFLLOCK(); -	f->next = libc.ofl_head; -	if (libc.ofl_head) libc.ofl_head->prev = f; -	libc.ofl_head = f; -	OFLUNLOCK(); - -	return f; +	return __ofl_add(f);  } diff --git a/src/stdio/open_wmemstream.c b/src/stdio/open_wmemstream.c index 35370309..7ab2c643 100644 --- a/src/stdio/open_wmemstream.c +++ b/src/stdio/open_wmemstream.c @@ -81,11 +81,5 @@ FILE *open_wmemstream(wchar_t **bufp, size_t *sizep)  	if (!libc.threaded) f->lock = -1; -	OFLLOCK(); -	f->next = libc.ofl_head; -	if (libc.ofl_head) libc.ofl_head->prev = f; -	libc.ofl_head = f; -	OFLUNLOCK(); - -	return f; +	return __ofl_add(f);  } diff --git a/src/thread/pthread_create.c b/src/thread/pthread_create.c index de72818d..6e2e4816 100644 --- a/src/thread/pthread_create.c +++ b/src/thread/pthread_create.c @@ -191,8 +191,9 @@ int __pthread_create(pthread_t *restrict res, const pthread_attr_t *restrict att  	if (!libc.can_do_threads) return ENOSYS;  	self = __pthread_self();  	if (!libc.threaded) { -		for (FILE *f=libc.ofl_head; f; f=f->next) +		for (FILE *f=*__ofl_lock(); f; f=f->next)  			init_file_lock(f); +		__ofl_unlock();  		init_file_lock(__stdin_used);  		init_file_lock(__stdout_used);  		init_file_lock(__stderr_used);  | 
