From 41c3da6ae1f582c4e6062e706cd07a1f664df9ac Mon Sep 17 00:00:00 2001 From: Jeff Johnston Date: Tue, 9 Mar 2004 21:27:37 +0000 Subject: [PATCH] 2004-03-09 Thomas Pfaff * libc/stdio/findfp.c (__sfp): Rename lock to __sfp_lock. Change __sfp_lock to static global. (__fp_lock): New static function. (__fp_unlock): Ditto. (__fp_lock_all): New function. (__fp_unlock_all): Ditto. --- newlib/ChangeLog | 9 +++++++ newlib/libc/stdio/findfp.c | 51 ++++++++++++++++++++++++++++++++++---- 2 files changed, 55 insertions(+), 5 deletions(-) diff --git a/newlib/ChangeLog b/newlib/ChangeLog index 9b2e13eb2..2f8cf5657 100644 --- a/newlib/ChangeLog +++ b/newlib/ChangeLog @@ -1,3 +1,12 @@ +2004-03-09 Thomas Pfaff + + * libc/stdio/findfp.c (__sfp): Rename lock to __sfp_lock. + Change __sfp_lock to static global. + (__fp_lock): New static function. + (__fp_unlock): Ditto. + (__fp_lock_all): New function. + (__fp_unlock_all): Ditto. + 2004-02-10 Christopher Faylor * libm/mathfp/er_gamma.c (gamma): Add new non-reentrant function. diff --git a/newlib/libc/stdio/findfp.c b/newlib/libc/stdio/findfp.c index 0ea7e31a2..0ddbf9403 100644 --- a/newlib/libc/stdio/findfp.c +++ b/newlib/libc/stdio/findfp.c @@ -25,6 +25,10 @@ #include #include "local.h" +#ifndef __SINGLE_THREAD__ +__LOCK_INIT(static, __sfp_lock); +#endif + static void std (ptr, flags, file, data) FILE *ptr; @@ -87,9 +91,7 @@ __sfp (d) struct _glue *g; #ifndef __SINGLE_THREAD__ - __LOCK_INIT(static, lock); - - __lock_acquire(lock); + __lock_acquire(__sfp_lock); #endif if (!_GLOBAL_REENT->__sdidinit) @@ -104,7 +106,7 @@ __sfp (d) break; } #ifndef __SINGLE_THREAD__ - __lock_release(lock); + __lock_release(__sfp_lock); #endif d->_errno = ENOMEM; return NULL; @@ -112,7 +114,7 @@ __sfp (d) found: fp->_flags = 1; /* reserve this slot; caller sets real flags */ #ifndef __SINGLE_THREAD__ - __lock_release(lock); + __lock_release(__sfp_lock); #endif fp->_p = NULL; /* no current pointer */ fp->_w = 0; /* nothing to read or write */ @@ -192,3 +194,42 @@ __sinit (s) std (s->_stderr, __SWR | __SNBF, 2, s); } + +#ifndef __SINGLE_THREAD__ + +/* Walkable file locking routine. */ +static int +__fp_lock (ptr) + FILE * ptr; +{ + _flockfile(ptr); + + return 0; +} + +/* Walkable file unlocking routine. */ +static int +__fp_unlock (ptr) + FILE * ptr; +{ + _funlockfile(ptr); + + return 0; +} + +void +__fp_lock_all () +{ + __lock_acquire(__sfp_lock); + + (void) _fwalk (_REENT, __fp_lock); +} + +void +__fp_unlock_all () +{ + (void) _fwalk (_REENT, __fp_unlock); + + __lock_release(__sfp_lock); +} +#endif