From ed1a95dc2529af31b0c622da451334a12ef6d436 Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Thu, 22 Jan 2004 22:06:57 +0000 Subject: [PATCH] 2004-01-22 Thomas Pfaff * libc/stdio/findfp.c (__sfp): Protect global FILE pointer list by a lock when newlib is multithreaded. --- newlib/ChangeLog | 5 +++++ newlib/libc/stdio/findfp.c | 12 ++++++++++++ 2 files changed, 17 insertions(+) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index a3e0ff9a9..0421e7ee2 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,8 @@ +2004-01-22 Thomas Pfaff + + * libc/stdio/findfp.c (__sfp): Protect global FILE pointer list + by a lock when newlib is multithreaded. + 2004-01-21 Jeff Johnston * libc/stdlib/mbrtowc.c (_mbrtowc_r): Fix case where s is null diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c index aff231ed4..0ea7e31a2 100644 --- a/newlib/libc/stdio/findfp.c +++ b/newlib/libc/stdio/findfp.c @@ -86,6 +86,12 @@ __sfp (d) int n; struct _glue *g; +#ifndef __SINGLE_THREAD__ + __LOCK_INIT(static, lock); + + __lock_acquire(lock); +#endif + if (!_GLOBAL_REENT->__sdidinit) __sinit (_GLOBAL_REENT); for (g = &_GLOBAL_REENT->__sglue;; g = g->_next) @@ -97,11 +103,17 @@ __sfp (d) (g->_next = __sfmoreglue (d, NDYNAMIC)) == NULL) break; } +#ifndef __SINGLE_THREAD__ + __lock_release(lock); +#endif d->_errno = ENOMEM; return NULL; found: fp->_flags = 1; /* reserve this slot; caller sets real flags */ +#ifndef __SINGLE_THREAD__ + __lock_release(lock); +#endif fp->_p = NULL; /* no current pointer */ fp->_w = 0; /* nothing to read or write */ fp->_r = 0;