Replace _fwalk() calls with _fwalk_reent()

Remove the _fwalk() implementation to avoid duplicated code with
_fwalk_reent().
This commit is contained in:
Sebastian Huber 2022-03-30 11:15:07 +02:00
parent 0239bc706a
commit 7a5903078d
5 changed files with 15 additions and 42 deletions

View File

@ -323,20 +323,20 @@ __sinit_lock_release (void)
/* Walkable file locking routine. */
static int
__fp_lock (FILE * ptr)
__fp_lock (struct _reent * ptr __unused, FILE * fp)
{
if (!(ptr->_flags2 & __SNLK))
_flockfile (ptr);
if (!(fp->_flags2 & __SNLK))
_flockfile (fp);
return 0;
}
/* Walkable file unlocking routine. */
static int
__fp_unlock (FILE * ptr)
__fp_unlock (struct _reent * ptr __unused, FILE * fp)
{
if (!(ptr->_flags2 & __SNLK))
_funlockfile (ptr);
if (!(fp->_flags2 & __SNLK))
_funlockfile (fp);
return 0;
}
@ -346,13 +346,13 @@ __fp_lock_all (void)
{
__sfp_lock_acquire ();
(void) _fwalk (_REENT, __fp_lock);
(void) _fwalk_reent (_REENT, __fp_lock);
}
void
__fp_unlock_all (void)
{
(void) _fwalk (_REENT, __fp_unlock);
(void) _fwalk_reent (_REENT, __fp_unlock);
__sfp_lock_release ();
}

View File

@ -27,32 +27,6 @@ static char sccsid[] = "%W% (Berkeley) %G%";
#include <errno.h>
#include "local.h"
int
_fwalk (struct _reent *ptr,
register int (*function) (FILE *))
{
register FILE *fp;
register int n, ret = 0;
register struct _glue *g;
/*
* It should be safe to walk the list without locking it;
* new nodes are only added to the end and none are ever
* removed.
*
* Avoid locking this list while walking it or else you will
* introduce a potential deadlock in [at least] refill.c.
*/
for (g = &ptr->__sglue; g != NULL; g = g->_next)
for (fp = g->_iobs, n = g->_niobs; --n >= 0; fp++)
if (fp->_flags != 0 && fp->_flags != 1 && fp->_file != -1)
ret |= (*function) (fp);
return ret;
}
/* Special version of __fwalk where the function pointer is a reentrant
I/O function (e.g. _fclose_r). */
int
_fwalk_reent (struct _reent *ptr,
register int (*reent_function) (struct _reent *, FILE *))

View File

@ -183,7 +183,6 @@ extern void __sinit (struct _reent *);
extern void _cleanup_r (struct _reent *);
extern void __smakebuf_r (struct _reent *, FILE *);
extern int __swhatbuf_r (struct _reent *, FILE *, size_t *, int *);
extern int _fwalk (struct _reent *, int (*)(FILE *));
extern int _fwalk_reent (struct _reent *, int (*)(struct _reent *, FILE *));
struct _glue * __sfmoreglue (struct _reent *,int n);
extern int __submore (struct _reent *, FILE *);

View File

@ -23,10 +23,10 @@
#include "local.h"
static int
lflush (FILE *fp)
lflush (struct _reent * ptr __unused, FILE *fp)
{
if ((fp->_flags & (__SLBF | __SWR)) == (__SLBF | __SWR))
return fflush (fp);
return _fflush_r (_REENT, fp);
return 0;
}
@ -102,10 +102,10 @@ __srefill_r (struct _reent * ptr,
*/
if (fp->_flags & (__SLBF | __SNBF))
{
/* Ignore this file in _fwalk to avoid potential deadlock. */
/* Ignore this file in _fwalk_reent to avoid potential deadlock. */
short orig_flags = fp->_flags;
fp->_flags = 1;
(void) _fwalk (_GLOBAL_REENT, lflush);
(void) _fwalk_reent (_GLOBAL_REENT, lflush);
fp->_flags = orig_flags;
/* Now flush this file without locking it. */

View File

@ -3058,10 +3058,10 @@ _cygwin_istext_for_stdio (int fd)
}
/* internal newlib function */
extern "C" int _fwalk (struct _reent *ptr, int (*function) (FILE *));
extern "C" int _fwalk_reent (struct _reent *ptr, int (*function) (struct _reent *, FILE *));
static int
setmode_helper (FILE *f)
setmode_helper (struct _reent *ptr __unused, FILE *f)
{
if (fileno (f) != _my_tls.locals.setmode_file)
{
@ -3137,7 +3137,7 @@ cygwin_setmode (int fd, int mode)
_my_tls.locals.setmode_mode = O_TEXT;
else
_my_tls.locals.setmode_mode = O_BINARY;
_fwalk (_GLOBAL_REENT, setmode_helper);
_fwalk_reent (_GLOBAL_REENT, setmode_helper);
}
return res;
}