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;