This is the mail archive of the libc-hacker@sources.redhat.com mailing list for the glibc project.

Note that libc-hacker is a closed list. You may look at the archives of this list, but subscription and posting are not open.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[PATCH] Speed up libio


Hi!

The following patch should speed up libio a little bit, especially small
functions like getc, by using __attribute__((cleanup)) instead of
_IO_cleanup_region_start/_IO_flockfile +
_IO_funlockfile/_IO_cleanup_region_end.
I think the new macros (_IO_acquire_lock/_IO_release_lock) are more readable
than what libio had to do before.
I've verified that with the generic bits/stdio-lock.h definitions libio is
bitwide-identical (stripped, -DNDEBUG=1).

I haven't added -fexceptions for filedoalloc.os, filedoalloc.os and
wfiledoalloc.os (had to obviously add all functions using _IO_acquire_lock
plus objects which they call into if those could have exceptions thrown
through), as I'm not sure whether they really need it or not.

2003-08-29  Jakub Jelinek  <jakub@redhat.com>

	* libio/Makefile: Compile fputc.c, fputwc.c, freopen64.c, freopen.c,
	fseek.c, fseeko64.c, fseeko.c, ftello64.c, ftello.c, fwide.c, getc.c,
	getchar.c, getwc.c, getwchar.c, iofclose.c, iofflush.c, iofgetpos64.c,
	iofgetpos.c, iofgets.c, iofgetws.c, iofputs.c, iofputws.c, iofread.c,
	iofsetpos64.c, iofsetpos.c, ioftell.c, iofwrite.c, iogetdelim.c,
	iogetline.c, iogets.c, iogetwline.c, ioputs.c, ioseekoff.c,
	ioseekpos.c, iosetbuffer.c, iosetvbuf.c, ioungetc.c, ioungetwc.c,
	oldfileops.c, oldiofclose.c, oldiofgetpos64.c, oldiofgetpos.c,
	oldiofsetpos64.c, oldiofsetpos.c, peekc.c, putc.c, putchar.c, putwc.c,
	putwchar.c and rewind.c with exceptions.
	* sysdeps/generic/bits/stdio-lock.h (_IO_acquire_lock,
	_IO_release_lock): Define.
	* libio/fileops.c (_IO_new_file_underflow): Use it.
	* libio/fputc.c (fputc): Likewise.
	* libio/fputwc.c (fputwc): Likewise.
	* libio/freopen64.c (freopen64):
	* libio/freopen.c (freopen): Likewise.
	* libio/fseek.c (fseek): Likewise.
	* libio/fseeko64.c (fseeko64): Likewise.
	* libio/fseeko.c (fseeko): Likewise.
	* libio/ftello64.c (ftello64): Likewise.
	* libio/ftello.c (ftello): Likewise.
	* libio/fwide.c (fwide): Likewise.
	* libio/getc.c (_IO_getc): Likewise.
	* libio/getchar.c (getchar): Likewise.
	* libio/getwc.c (_IO_getwc): Likewise.
	* libio/getwchar.c (getwchar): Likewise.
	* libio/iofclose.c (_IO_new_fclose):
	* libio/iofflush.c (_IO_fflush): Likewise.
	* libio/iofgetpos64.c (_IO_new_fgetpos64): Likewise.
	* libio/iofgetpos.c (_IO_new_fgetpos): Likewise.
	* libio/iofgets.c (_IO_fgets): Likewise.
	* libio/iofgetws.c (fgetws): Likewise.
	* libio/iofputs.c (_IO_fputs):
	* libio/iofputws.c (_IO_fputs): Likewise.
	* libio/iofread.c (_IO_fread): Likewise.
	* libio/iofsetpos64.c (_IO_new_fsetpos64): Likewise.
	* libio/iofsetpos.c (_IO_new_fsetpos): Likewise.
	* libio/ioftell.c (_IO_ftell): Likewise.
	* libio/iofwrite.c (_IO_fwrite): Likewise.
	* libio/iogetdelim.c (_IO_getdelim): Likewise.
	* libio/iogets.c (_IO_gets): Likewise.
	* libio/ioputs.c (_IO_puts): Likewise.
	* libio/ioseekoff.c (_IO_seekoff): Likewise.
	* libio/ioseekpos.c (_IO_seekpos): Likewise.
	* libio/iosetbuffer.c (_IO_setbuffer): Likewise.
	* libio/iosetvbuf.c (_IO_setvbuf): Likewise.
	* libio/ioungetc.c (_IO_ungetc): Likewise.
	* libio/ioungetwc.c (ungetwc): Likewise.
	* libio/oldiofclose.c (_IO_old_fclose): Likewise.
	* libio/oldiofgetpos64.c (_IO_old_fgetpos64): Likewise.
	* libio/oldiofgetpos.c (_IO_old_fgetpos): Likewise.
	* libio/oldiofsetpos64.c (_IO_old_fsetpos64): Likewise.
	* libio/oldiofsetpos.c (_IO_old_fsetpos): Likewise.
	* libio/peekc.c (_IO_peekc_locked): Likewise.
	* libio/putc.c (_IO_putc): Likewise.
	* libio/putchar.c (putchar): Likewise.
	* libio/putwc.c (putwc): Likewise.
	* libio/putwchar.c (putwchar): Likewise.
	* libio/rewind.c (rewind): Likewise.
	* libio/wfileops.c (_IO_wfile_underflow): Likewise.
nptl/
	* sysdeps/pthread/bits/stdio-lock.h (_IO_acquire_lock,
	_IO_release_lock): Define.

--- libc/nptl/sysdeps/pthread/bits/stdio-lock.h.jj	2002-12-20 04:28:02.000000000 -0500
+++ libc/nptl/sysdeps/pthread/bits/stdio-lock.h	2002-12-20 04:28:02.000000000 -0500
@@ -1,5 +1,5 @@
-/* Thread package specific definitions of stream lock type.  Generic version.
-   Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+/* Thread package specific definitions of stream lock type.  NPTL version.
+   Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -85,5 +85,26 @@ typedef struct { int lock; int cnt; void
 #define _IO_cleanup_region_end(_doit) \
   __libc_cleanup_region_end (_doit)
 
+#if defined _LIBC && !defined NOT_IN_libc
+
+# ifdef __EXCEPTIONS
+#  define _IO_acquire_lock(_fp) \
+  do {									      \
+    auto inline __attribute__((always_inline)) void			      \
+    _IO_acquire_lock_fct (int *p __attribute__ ((__unused__)))		      \
+      {									      \
+	if (((_fp)->_flags & _IO_USER_LOCK) == 0)			      \
+	  _IO_funlockfile (_fp);					      \
+      }									      \
+    int _IO_acquire_lock_dummy						      \
+      __attribute__ ((cleanup (_IO_acquire_lock_fct)));			      \
+    _IO_flockfile (_fp)
+
+# else
+#  define _IO_acquire_lock(_fp) _IO_acquire_lock_needs_exceptions_enabled
+# endif
+# define _IO_release_lock(_fp) ; } while (0)
+
+#endif
 
 #endif /* bits/stdio-lock.h */
--- libc/libio/fileops.c.jj	2003-07-15 11:04:36.000000000 -0400
+++ libc/libio/fileops.c	2003-08-29 08:35:18.000000000 -0400
@@ -562,16 +562,13 @@ _IO_new_file_underflow (fp)
 	 traditional Unix systems did this for stdout.  stderr better
 	 not be line buffered.  So we do just that here
 	 explicitly.  --drepper */
-      _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
-				_IO_stdout);
-      _IO_flockfile (_IO_stdout);
+      _IO_acquire_lock (_IO_stdout);
 
       if ((_IO_stdout->_flags & (_IO_LINKED | _IO_NO_WRITES | _IO_LINE_BUF))
 	  == (_IO_LINKED | _IO_LINE_BUF))
 	_IO_OVERFLOW (_IO_stdout, EOF);
 
-      _IO_funlockfile (_IO_stdout);
-      _IO_cleanup_region_end (0);
+      _IO_release_lock (_IO_stdout);
 #endif
     }
 
--- libc/libio/fwide.c.jj	2001-07-06 00:54:54.000000000 -0400
+++ libc/libio/fwide.c	2003-08-29 08:44:41.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1999, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1999, 2000, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -44,13 +44,9 @@ fwide (fp, mode)
        or the orientation already has been determined.  */
     return fp->_mode;
 
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
-
+  _IO_acquire_lock (fp);
   result = _IO_fwide (fp, mode);
-
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
 
   return result;
 }
--- libc/libio/fputc.c.jj	2001-07-06 00:54:53.000000000 -0400
+++ libc/libio/fputc.c	2003-08-29 08:36:11.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1996, 1997, 1998, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -35,11 +35,9 @@ fputc (c, fp)
 {
   int result;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   result = _IO_putc_unlocked (c, fp);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 
--- libc/libio/fputwc.c.jj	2001-07-06 00:54:54.000000000 -0400
+++ libc/libio/fputwc.c	2003-08-29 08:37:09.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1996,1997,1998,1999,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -35,13 +35,11 @@ fputwc (wc, fp)
 {
   int result;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (_IO_fwide (fp, 1) < 0)
     result = WEOF;
   else
     result = _IO_putwc_unlocked (wc, fp);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
--- libc/libio/ftello.c.jj	2002-11-05 03:23:47.000000000 -0500
+++ libc/libio/ftello.c	2003-08-29 08:43:15.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995-2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995-2001, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -37,16 +37,14 @@ ftello (fp)
 {
   _IO_off64_t pos;
   CHECK_FILE (fp, -1L);
-  _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
   if (_IO_in_backup (fp))
     {
       if (fp->_mode <= 0)
 	pos -= fp->_IO_save_end - fp->_IO_save_base;
     }
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   if (pos == _IO_pos_BAD)
     {
 #ifdef EIO
--- libc/libio/freopen.c.jj	2003-08-14 05:05:27.000000000 -0400
+++ libc/libio/freopen.c	2003-08-29 08:38:17.000000000 -0400
@@ -44,8 +44,7 @@ freopen (filename, mode, fp)
   CHECK_FILE (fp, NULL);
   if (!(fp->_flags & _IO_IS_FILEBUF))
     return NULL;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (filename == NULL && _IO_fileno (fp) >= 0)
     {
       fd = __dup (_IO_fileno (fp));
@@ -84,7 +83,6 @@ freopen (filename, mode, fp)
       if (filename != NULL)
 	free ((char *) filename);
     }
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
--- libc/libio/getc.c.jj	2001-07-06 00:54:54.000000000 -0400
+++ libc/libio/getc.c	2003-08-29 08:45:27.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993, 95, 96, 97, 98, 99 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,11 +37,9 @@ _IO_getc (fp)
 {
   int result;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   result = _IO_getc_unlocked (fp);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 
--- libc/libio/freopen64.c.jj	2003-08-14 05:05:27.000000000 -0400
+++ libc/libio/freopen64.c	2003-08-29 08:39:18.000000000 -0400
@@ -44,8 +44,7 @@ freopen64 (filename, mode, fp)
   CHECK_FILE (fp, NULL);
   if (!(fp->_flags & _IO_IS_FILEBUF))
     return NULL;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (filename == NULL && _IO_fileno (fp) >= 0)
     {
       fd = __dup (_IO_fileno (fp));
@@ -68,8 +67,7 @@ freopen64 (filename, mode, fp)
       if (filename != NULL)
 	free ((char *) filename);
     }
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 #else
   __set_errno (ENOSYS);
--- libc/libio/peekc.c.jj	2001-07-06 00:54:58.000000000 -0400
+++ libc/libio/peekc.c	2003-08-29 09:18:22.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1995,1996,1997,1998,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,10 +36,8 @@ _IO_peekc_locked (fp)
 {
   int result;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   result = _IO_peekc_unlocked (fp);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
--- libc/libio/fseek.c.jj	2002-08-04 16:29:47.000000000 -0400
+++ libc/libio/fseek.c	2003-08-29 08:40:30.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993,1995,1996,1997,1998,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996, 1997, 1998, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,11 +37,9 @@ fseek (fp, offset, whence)
 {
   int result;
   CHECK_FILE (fp, -1);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   result = _IO_fseek (fp, offset, whence);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 libc_hidden_def (fseek)
--- libc/libio/fseeko.c.jj	2001-07-06 00:54:54.000000000 -0400
+++ libc/libio/fseeko.c	2003-08-29 08:41:27.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1995,1996,1997,1998,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,10 +36,8 @@ fseeko (fp, offset, whence)
 {
   int result;
   CHECK_FILE (fp, -1);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   result = _IO_fseek (fp, offset, whence);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
--- libc/libio/fseeko64.c.jj	2001-07-06 00:54:54.000000000 -0400
+++ libc/libio/fseeko64.c	2003-08-29 08:42:00.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1995,1996,1997,1998,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -38,11 +38,9 @@ fseeko64 (fp, offset, whence)
 #ifdef _G_LSEEK64
   int result;
   CHECK_FILE (fp, -1);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   result = _IO_fseek (fp, offset, whence);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 #else
   __set_errno (ENOSYS);
--- libc/libio/ftello64.c.jj	2002-11-05 03:23:47.000000000 -0500
+++ libc/libio/ftello64.c	2003-08-29 08:43:46.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995-2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995-2001, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -38,16 +38,14 @@ ftello64 (fp)
 #ifdef _G_LSEEK64
   _IO_off64_t pos;
   CHECK_FILE (fp, -1L);
-  _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
   if (_IO_in_backup (fp))
     {
       if (fp->_mode <= 0)
 	pos -= fp->_IO_save_end - fp->_IO_save_base;
     }
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   if (pos == _IO_pos_BAD)
     {
 #ifdef EIO
--- libc/libio/getchar.c.jj	2001-07-06 00:54:55.000000000 -0400
+++ libc/libio/getchar.c	2003-08-29 08:47:23.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1996, 1997, 1998, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -34,12 +34,9 @@ int
 getchar ()
 {
   int result;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
-			    _IO_stdin);
-  _IO_flockfile (_IO_stdin);
+  _IO_acquire_lock (_IO_stdin);
   result = _IO_getc_unlocked (_IO_stdin);
-  _IO_funlockfile (_IO_stdin);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (_IO_stdin);
   return result;
 }
 
--- libc/libio/putc.c.jj	2002-02-25 20:43:50.000000000 -0500
+++ libc/libio/putc.c	2003-08-29 09:18:58.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991,1995,1996,1997,1998,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1995, 1996, 1997, 1998, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -28,11 +29,9 @@ _IO_putc (c, fp)
 {
   int result;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   result = _IO_putc_unlocked (c, fp);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 INTDEF(_IO_putc)
--- libc/libio/getwc.c.jj	2001-07-06 00:54:55.000000000 -0400
+++ libc/libio/getwc.c	2003-08-29 08:49:00.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993, 95, 96, 97, 98, 99, 2000 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -37,11 +38,9 @@ _IO_getwc (fp)
 {
   wint_t result;
   CHECK_FILE (fp, WEOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   result = _IO_getwc_unlocked (fp);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 
--- libc/libio/getwchar.c.jj	2001-07-06 00:54:55.000000000 -0400
+++ libc/libio/getwchar.c	2003-08-29 08:49:37.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1996, 1997, 1998, 1999 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1996,1997,1998,1999,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -34,11 +34,8 @@ wint_t
 getwchar ()
 {
   wint_t result;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
-			    _IO_stdin);
-  _IO_flockfile (_IO_stdin);
+  _IO_acquire_lock (_IO_stdin);
   result = _IO_getwc_unlocked (_IO_stdin);
-  _IO_funlockfile (_IO_stdin);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (_IO_stdin);
   return result;
 }
--- libc/libio/oldiofsetpos64.c.jj	2002-11-05 03:25:15.000000000 -0500
+++ libc/libio/oldiofsetpos64.c	2003-08-29 09:17:30.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993,95,97,98,99,2000,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1997, 1998, 1999, 2000, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -39,8 +40,7 @@ _IO_old_fsetpos64 (fp, posp)
 #ifdef _G_LSEEK64
   int result;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (_IO_seekpos_unlocked (fp, posp->__pos, _IOS_INPUT|_IOS_OUTPUT)
       == _IO_pos_BAD)
     {
@@ -54,8 +54,7 @@ _IO_old_fsetpos64 (fp, posp)
     }
   else
     result = 0;
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 #else
   __set_errno (ENOSYS);
--- libc/libio/iofclose.c.jj	2003-08-14 05:05:27.000000000 -0400
+++ libc/libio/iofclose.c	2003-08-29 08:50:32.000000000 -0400
@@ -57,15 +57,13 @@ _IO_new_fclose (fp)
   if (fp->_IO_file_flags & _IO_IS_FILEBUF)
     INTUSE(_IO_un_link) ((struct _IO_FILE_plus *) fp);
 
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (fp->_IO_file_flags & _IO_IS_FILEBUF)
     status = INTUSE(_IO_file_close_it) (fp);
   else
     status = fp->_flags & _IO_ERR_SEEN ? -1 : 0;
   _IO_FINISH (fp);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   if (fp->_mode > 0)
     {
 #if _LIBC
--- libc/libio/putchar.c.jj	2001-07-06 00:54:58.000000000 -0400
+++ libc/libio/putchar.c	2003-08-29 09:40:01.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 1995, 1996, 1997, 1998 Free Software Foundation, Inc.
+/* Copyright (C) 1991,1995,1996,1997,1998,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -26,12 +26,9 @@ putchar (c)
      int c;
 {
   int result;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
-			       _IO_stdout);
-  _IO_flockfile (_IO_stdout);
+  _IO_acquire_lock (_IO_stdout);
   result = _IO_putc_unlocked (c, _IO_stdout);
-  _IO_funlockfile (_IO_stdout);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (_IO_stdout);
   return result;
 }
 
--- libc/libio/iofflush.c.jj	2002-11-24 18:56:42.000000000 -0500
+++ libc/libio/iofflush.c	2003-08-29 08:51:19.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993,1995,1996,1997,1998,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996, 1997, 1998, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -38,11 +39,9 @@ _IO_fflush (fp)
     {
       int result;
       CHECK_FILE (fp, EOF);
-      _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-      _IO_flockfile (fp);
+      _IO_acquire_lock (fp);
       result = _IO_SYNC (fp) ? EOF : 0;
-      _IO_funlockfile (fp);
-      _IO_cleanup_region_end (0);
+      _IO_release_lock (fp);
       return result;
     }
 }
--- libc/libio/iofgetpos.c.jj	2002-11-05 03:23:47.000000000 -0500
+++ libc/libio/iofgetpos.c	2003-08-29 08:51:52.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995-2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995-2001, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -38,8 +38,7 @@ _IO_new_fgetpos (fp, posp)
   _IO_off64_t pos;
   int result = 0;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
   if (_IO_in_backup (fp))
     {
@@ -72,8 +71,7 @@ _IO_new_fgetpos (fp, posp)
 	posp->__state = fp->_wide_data->_IO_state;
     }
 
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 
--- libc/libio/putwc.c.jj	2002-08-10 05:24:43.000000000 -0400
+++ libc/libio/putwc.c	2003-08-29 09:20:13.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1991,95,96,97,98,99,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1991, 1995, 1996, 1997, 1998, 1999, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -26,11 +27,9 @@ putwc (wc, fp)
 {
   wint_t result;
   CHECK_FILE (fp, WEOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   result = _IO_putwc_unlocked (wc, fp);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 libc_hidden_def (putwc)
--- libc/libio/iofgetpos64.c.jj	2002-11-05 03:23:47.000000000 -0500
+++ libc/libio/iofgetpos64.c	2003-08-29 08:55:02.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1995-2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995-2001, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -38,16 +38,14 @@ _IO_new_fgetpos64 (fp, posp)
 #ifdef _G_LSEEK64
   _IO_off64_t pos;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
   if (_IO_in_backup (fp))
     {
       if (fp->_mode <= 0)
 	pos -= fp->_IO_save_end - fp->_IO_save_base;
     }
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   if (pos == _IO_pos_BAD)
     {
       /* ANSI explicitly requires setting errno to a positive value on
--- libc/libio/iofgets.c.jj	2002-08-26 07:36:40.000000000 -0400
+++ libc/libio/iofgets.c	2003-08-29 08:56:13.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993, 95, 96, 97, 98, 99, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -40,8 +41,7 @@ _IO_fgets (buf, n, fp)
   CHECK_FILE (fp, NULL);
   if (n <= 0)
     return NULL;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   /* This is very tricky since a file descriptor may be in the
      non-blocking mode. The error flag doesn't mean much in this
      case. We return an error only when there is a new error. */
@@ -59,8 +59,7 @@ _IO_fgets (buf, n, fp)
       result = buf;
     }
   fp->_IO_file_flags |= old_error;
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 
--- libc/libio/iofgetws.c.jj	2001-08-08 20:08:15.000000000 -0400
+++ libc/libio/iofgetws.c	2003-08-29 08:58:14.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993, 95, 96, 97, 98, 99, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2001
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -40,8 +41,7 @@ fgetws (buf, n, fp)
   CHECK_FILE (fp, NULL);
   if (n <= 0)
     return NULL;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   /* This is very tricky since a file descriptor may be in the
      non-blocking mode. The error flag doesn't mean much in this
      case. We return an error only when there is a new error. */
@@ -58,7 +58,6 @@ fgetws (buf, n, fp)
       result = buf;
     }
   fp->_IO_file_flags |= old_error;
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
--- libc/libio/rewind.c.jj	2002-08-10 05:24:43.000000000 -0400
+++ libc/libio/rewind.c	2003-08-29 09:21:28.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993,96,97,98,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993,96,97,98,2002,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -33,11 +33,9 @@ rewind (fp)
      _IO_FILE *fp;
 {
   CHECK_FILE (fp, );
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   _IO_rewind (fp);
   _IO_clearerr (fp);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
 }
 libc_hidden_def (rewind)
--- libc/libio/iofputs.c.jj	2003-08-14 05:05:27.000000000 -0400
+++ libc/libio/iofputs.c	2003-08-29 08:58:55.000000000 -0400
@@ -37,13 +37,11 @@ _IO_fputs (str, fp)
   _IO_size_t len = strlen (str);
   int result = EOF;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if ((_IO_vtable_offset (fp) != 0 || _IO_fwide (fp, -1) == -1)
       && _IO_sputn (fp, str, len) == len)
     result = 1;
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 libc_hidden_def (_IO_fputs)
--- libc/libio/Makefile.jj	2002-10-24 14:48:54.000000000 -0400
+++ libc/libio/Makefile	2003-08-29 11:15:46.000000000 -0400
@@ -75,10 +75,60 @@ CPPFLAGS += -D_IO_MTSAFE_IO
 endif
 
 # Support for exception handling.
-CFLAGS-genops.c = $(exceptions)
-CFLAGS-wgenops.c = $(exceptions)
 CFLAGS-fileops.c = $(exceptions)
+CFLAGS-fputc.c = $(exceptions)
+CFLAGS-fputwc.c = $(exceptions)
+CFLAGS-freopen64.c = $(exceptions)
+CFLAGS-freopen.c = $(exceptions)
+CFLAGS-fseek.c = $(exceptions)
+CFLAGS-fseeko64.c = $(exceptions)
+CFLAGS-fseeko.c = $(exceptions)
+CFLAGS-ftello64.c = $(exceptions)
+CFLAGS-ftello.c = $(exceptions)
+CFLAGS-fwide.c = $(exceptions)
+CFLAGS-genops.c = $(exceptions)
+CFLAGS-getc.c = $(exceptions)
+CFLAGS-getchar.c = $(exceptions)
+CFLAGS-getwc.c = $(exceptions)
+CFLAGS-getwchar.c = $(exceptions)
+CFLAGS-iofclose.c = $(exceptions)
+CFLAGS-iofflush.c = $(exceptions)
+CFLAGS-iofgetpos64.c = $(exceptions)
+CFLAGS-iofgetpos.c = $(exceptions)
+CFLAGS-iofgets.c = $(exceptions)
+CFLAGS-iofgetws.c = $(exceptions)
+CFLAGS-iofputs.c = $(exceptions)
+CFLAGS-iofputws.c = $(exceptions)
+CFLAGS-iofread.c = $(exceptions)
+CFLAGS-iofsetpos64.c = $(exceptions)
+CFLAGS-iofsetpos.c = $(exceptions)
+CFLAGS-ioftell.c = $(exceptions)
+CFLAGS-iofwrite.c = $(exceptions)
+CFLAGS-iogetdelim.c = $(exceptions)
+CFLAGS-iogetline.c = $(exceptions)
+CFLAGS-iogets.c = $(exceptions)
+CFLAGS-iogetwline.c = $(exceptions)
+CFLAGS-ioputs.c = $(exceptions)
+CFLAGS-ioseekoff.c = $(exceptions)
+CFLAGS-ioseekpos.c = $(exceptions)
+CFLAGS-iosetbuffer.c = $(exceptions)
+CFLAGS-iosetvbuf.c = $(exceptions)
+CFLAGS-ioungetc.c = $(exceptions)
+CFLAGS-ioungetwc.c = $(exceptions)
+CFLAGS-oldfileops.c = $(exceptions)
+CFLAGS-oldiofclose.c = $(exceptions)
+CFLAGS-oldiofgetpos64.c = $(exceptions)
+CFLAGS-oldiofgetpos.c = $(exceptions)
+CFLAGS-oldiofsetpos64.c = $(exceptions)
+CFLAGS-oldiofsetpos.c = $(exceptions)
+CFLAGS-peekc.c = $(exceptions)
+CFLAGS-putc.c = $(exceptions)
+CFLAGS-putchar.c = $(exceptions)
+CFLAGS-putwc.c = $(exceptions)
+CFLAGS-putwchar.c = $(exceptions)
+CFLAGS-rewind.c = $(exceptions)
 CFLAGS-wfileops.c = $(exceptions)
+CFLAGS-wgenops.c = $(exceptions)
 # XXX Do we need filedoalloc and wfiledoalloc?  Others?
 
 CFLAGS-tst_putwc.c = -DOBJPFX=\"$(objpfx)\"
--- libc/libio/iofputws.c.jj	2001-07-06 00:54:55.000000000 -0400
+++ libc/libio/iofputws.c	2003-08-29 08:59:29.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993,1996,1997,1998,1999,2000 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1996, 1997, 1998, 1999, 2000, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,12 +37,10 @@ fputws (str, fp)
   _IO_size_t len = __wcslen (str);
   int result = EOF;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (_IO_fwide (fp, 1) == 1
       && _IO_sputn (fp, (char *) str, len) == len)
     result = 1;
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
--- libc/libio/iofread.c.jj	2002-08-26 07:36:40.000000000 -0400
+++ libc/libio/iofread.c	2003-08-29 09:00:08.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993,1995,1997,1998,1999,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1997, 1998, 1999, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -39,11 +40,9 @@ _IO_fread (buf, size, count, fp)
   CHECK_FILE (fp, 0);
   if (bytes_requested == 0)
     return 0;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   bytes_read = INTUSE(_IO_sgetn) (fp, (char *) buf, bytes_requested);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return bytes_requested == bytes_read ? count : bytes_read / size;
 }
 INTDEF(_IO_fread)
--- libc/libio/iofsetpos.c.jj	2002-11-05 03:25:15.000000000 -0500
+++ libc/libio/iofsetpos.c	2003-08-29 09:00:45.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993, 1995, 1997-2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1997, 1998, 1999, 2000, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,8 +37,7 @@ _IO_new_fsetpos (fp, posp)
 {
   int result;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (_IO_seekpos_unlocked (fp, posp->__pos, _IOS_INPUT|_IOS_OUTPUT)
       == _IO_pos_BAD)
     {
@@ -57,8 +57,7 @@ _IO_new_fsetpos (fp, posp)
 	/* This is a stateful encoding, restore the state.  */
 	fp->_wide_data->_IO_state = posp->__state;
     }
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 
--- libc/libio/iofsetpos64.c.jj	2002-11-05 03:25:15.000000000 -0500
+++ libc/libio/iofsetpos64.c	2003-08-29 09:37:32.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993, 1995, 1997-2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1997, 1998, 1999, 2000, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -37,8 +38,7 @@ _IO_new_fsetpos64 (fp, posp)
 #ifdef _G_LSEEK64
   int result;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (_IO_seekpos_unlocked (fp, posp->__pos, _IOS_INPUT|_IOS_OUTPUT)
       == _IO_pos_BAD)
     {
@@ -58,8 +58,7 @@ _IO_new_fsetpos64 (fp, posp)
 	/* This is a stateful encoding, safe the state.  */
 	fp->_wide_data->_IO_state = posp->__state;
     }
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 #else
   __set_errno (ENOSYS);
--- libc/libio/putwchar.c.jj	2001-07-06 00:54:58.000000000 -0400
+++ libc/libio/putwchar.c	2003-08-29 09:39:24.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1991, 95, 96, 97, 98, 99 Free Software Foundation, Inc.
+/* Copyright (C) 1991,95,96,97,98,99,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -24,11 +24,8 @@ putwchar (wc)
      wchar_t wc;
 {
   wint_t result;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
-			    _IO_stdout);
-  _IO_flockfile (_IO_stdout);
+  _IO_acquire_lock (_IO_stdout);
   result = _IO_putwc_unlocked (wc, _IO_stdout);
-  _IO_funlockfile (_IO_stdout);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (_IO_stdout);
   return result;
 }
--- libc/libio/ioftell.c.jj	2003-08-14 05:05:27.000000000 -0400
+++ libc/libio/ioftell.c	2003-08-29 09:02:30.000000000 -0400
@@ -36,16 +36,14 @@ _IO_ftell (fp)
 {
   _IO_off64_t pos;
   CHECK_FILE (fp, -1L);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
   if (_IO_in_backup (fp))
     {
       if (_IO_vtable_offset (fp) != 0 || fp->_mode <= 0)
 	pos -= fp->_IO_save_end - fp->_IO_save_base;
     }
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   if (pos == _IO_pos_BAD)
     {
 #ifdef EIO
--- libc/libio/iofwrite.c.jj	2003-08-14 05:05:27.000000000 -0400
+++ libc/libio/iofwrite.c	2003-08-29 09:04:15.000000000 -0400
@@ -40,12 +40,10 @@ _IO_fwrite (buf, size, count, fp)
   CHECK_FILE (fp, 0);
   if (request == 0)
     return 0;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (_IO_vtable_offset (fp) != 0 || _IO_fwide (fp, -1) == -1)
     written = _IO_sputn (fp, (const char *) buf, request);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   if (written == request)
     return count;
   else
--- libc/libio/iogetdelim.c.jj	2001-12-29 10:57:14.000000000 -0500
+++ libc/libio/iogetdelim.c	2003-08-29 09:04:56.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1994, 1996, 1997, 1998, 2001 Free Software Foundation, Inc.
+/* Copyright (C) 1994,1996,1997,1998,2001,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -55,8 +55,7 @@ _IO_getdelim (lineptr, n, delimiter, fp)
       return -1;
     }
   CHECK_FILE (fp, -1);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (_IO_ferror_unlocked (fp))
     {
       result = -1;
@@ -120,8 +119,7 @@ _IO_getdelim (lineptr, n, delimiter, fp)
   result = cur_len;
 
 unlock_return:
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 
--- libc/libio/wfileops.c.jj	2003-03-27 06:53:59.000000000 -0500
+++ libc/libio/wfileops.c	2003-08-29 09:55:16.000000000 -0400
@@ -217,16 +217,13 @@ _IO_wfile_underflow (fp)
 	 traditional Unix systems did this for stdout.  stderr better
 	 not be line buffered.  So we do just that here
 	 explicitly.  --drepper */
-      _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
-				_IO_stdout);
-      _IO_flockfile (_IO_stdout);
+      _IO_acquire_lock (_IO_stdout);
 
       if ((_IO_stdout->_flags & (_IO_LINKED | _IO_NO_WRITES | _IO_LINE_BUF))
 	  == (_IO_LINKED | _IO_LINE_BUF))
 	_IO_OVERFLOW (_IO_stdout, EOF);
 
-      _IO_funlockfile (_IO_stdout);
-      _IO_cleanup_region_end (0);
+      _IO_release_lock (_IO_stdout);
 #endif
     }
 
--- libc/libio/iogets.c.jj	2002-02-25 20:43:50.000000000 -0500
+++ libc/libio/iogets.c	2003-08-29 09:05:49.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1996, 1997, 1998, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1996,1997,1998,2002,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,9 +36,7 @@ _IO_gets (buf)
   int ch;
   char *retval;
 
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
-			    _IO_stdin);
-  _IO_flockfile (_IO_stdin);
+  _IO_acquire_lock (_IO_stdin);
   ch = _IO_getc_unlocked (_IO_stdin);
   if (ch == EOF)
     {
@@ -67,8 +65,7 @@ _IO_gets (buf)
   buf[count] = 0;
   retval = buf;
 unlock_return:
-  _IO_funlockfile (_IO_stdin);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (_IO_stdin);
   return retval;
 }
 
--- libc/libio/ioputs.c.jj	2003-08-14 05:05:27.000000000 -0400
+++ libc/libio/ioputs.c	2003-08-29 09:07:10.000000000 -0400
@@ -34,9 +34,7 @@ _IO_puts (str)
 {
   int result = EOF;
   _IO_size_t len = strlen (str);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile,
-			    _IO_stdout);
-  _IO_flockfile (_IO_stdout);
+  _IO_acquire_lock (_IO_stdout);
 
   if ((_IO_vtable_offset (_IO_stdout) != 0
        || _IO_fwide (_IO_stdout, -1) == -1)
@@ -44,8 +42,7 @@ _IO_puts (str)
       && _IO_putc_unlocked ('\n', _IO_stdout) != EOF)
     result = len + 1;
 
-  _IO_funlockfile (_IO_stdout);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (_IO_stdout);
   return result;
 }
 
--- libc/libio/ioseekoff.c.jj	2003-08-25 19:12:15.000000000 -0400
+++ libc/libio/ioseekoff.c	2003-08-29 09:09:00.000000000 -0400
@@ -81,12 +81,8 @@ _IO_seekoff (fp, offset, dir, mode)
 {
   _IO_off64_t retval;
 
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
-
+  _IO_acquire_lock (fp);
   retval = _IO_seekoff_unlocked (fp, offset, dir, mode);
-
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return retval;
 }
--- libc/libio/ioseekpos.c.jj	2002-11-05 03:18:52.000000000 -0500
+++ libc/libio/ioseekpos.c	2003-08-29 09:09:37.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993, 1997, 1998, 1999, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1997,1998,1999,2002,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -59,12 +59,8 @@ _IO_seekpos (fp, pos, mode)
 {
   _IO_off64_t retval;
 
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
-
+  _IO_acquire_lock (fp);
   retval = _IO_seekpos_unlocked (fp, pos, mode);
-
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return retval;
 }
--- libc/libio/iosetbuffer.c.jj	2003-08-14 05:05:27.000000000 -0400
+++ libc/libio/iosetbuffer.c	2003-08-29 09:10:20.000000000 -0400
@@ -35,8 +35,7 @@ _IO_setbuffer (fp, buf, size)
      _IO_size_t size;
 {
   CHECK_FILE (fp, );
-  _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   fp->_flags &= ~_IO_LINE_BUF;
   if (!buf)
     size = 0;
@@ -44,8 +43,7 @@ _IO_setbuffer (fp, buf, size)
   if (_IO_vtable_offset (fp) == 0 && fp->_mode == 0 && _IO_CHECK_WIDE (fp))
     /* We also have to set the buffer using the wide char function.  */
     (void) _IO_WSETBUF (fp, buf, size);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
 }
 INTDEF(_IO_setbuffer)
 
--- libc/libio/iosetvbuf.c.jj	2002-06-22 00:42:47.000000000 -0400
+++ libc/libio/iosetvbuf.c	2003-08-29 09:36:36.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993,96,97,98,99,2000,2001,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -40,8 +41,7 @@ _IO_setvbuf (fp, buf, mode, size)
 {
   int result;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   switch (mode)
     {
     case _IOFBF:
@@ -96,8 +96,7 @@ _IO_setvbuf (fp, buf, mode, size)
   result = _IO_SETBUF (fp, buf, size) == NULL ? EOF : 0;
 
 unlock_return:
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 INTDEF(_IO_setvbuf)
--- libc/libio/ioungetc.c.jj	2002-02-25 20:43:50.000000000 -0500
+++ libc/libio/ioungetc.c	2003-08-29 09:11:34.000000000 -0400
@@ -1,4 +1,4 @@
-/* Copyright (C) 1993,1996,1997,1998,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993,1996,1997,1998,2002,2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -36,11 +36,9 @@ _IO_ungetc (c, fp)
   CHECK_FILE (fp, EOF);
   if (c == EOF)
     return EOF;
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp); 
   result = INTUSE(_IO_sputbackc) (fp, (unsigned char) c);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 
--- libc/libio/ioungetwc.c.jj	2002-02-25 20:43:50.000000000 -0500
+++ libc/libio/ioungetwc.c	2003-08-29 09:12:17.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993, 1996-1999, 2001, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1996, 1997, 1998, 1999, 2001, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -35,14 +36,12 @@ ungetwc (c, fp)
 {
   int result;
   CHECK_FILE (fp, WEOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   _IO_fwide (fp, 1);
   if (c == WEOF)
     result = WEOF;
   else
     result = INTUSE(_IO_sputbackwc) (fp, c);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
--- libc/libio/oldiofclose.c.jj	2003-08-12 06:24:57.000000000 -0400
+++ libc/libio/oldiofclose.c	2003-08-29 09:14:07.000000000 -0400
@@ -52,15 +52,13 @@ _IO_old_fclose (fp)
   if (fp->_IO_file_flags & _IO_IS_FILEBUF)
     INTUSE(_IO_un_link) ((struct _IO_FILE_plus *) fp);
 
-  _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (fp->_IO_file_flags & _IO_IS_FILEBUF)
     status = _IO_old_file_close_it (fp);
   else
     status = fp->_flags & _IO_ERR_SEEN ? -1 : 0;
   _IO_FINISH (fp);
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   if (_IO_have_backup (fp))
     INTUSE(_IO_free_backup_area) (fp);
   if (fp != _IO_stdin && fp != _IO_stdout && fp != _IO_stderr)
--- libc/libio/oldiofgetpos.c.jj	2002-11-05 03:23:47.000000000 -0500
+++ libc/libio/oldiofgetpos.c	2003-08-29 09:15:05.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993,95,96,97,98,99,2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -38,13 +39,11 @@ _IO_old_fgetpos (fp, posp)
 {
   _IO_off_t pos;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
   if (_IO_in_backup (fp))
     pos -= fp->_IO_save_end - fp->_IO_save_base;
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   if (pos == _IO_pos_BAD)
     {
       /* ANSI explicitly requires setting errno to a positive value on
--- libc/libio/oldiofgetpos64.c.jj	2002-11-05 03:23:47.000000000 -0500
+++ libc/libio/oldiofgetpos64.c	2003-08-29 09:15:53.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993,95,96,97,98,99,2000, 2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1996, 1997, 1998, 1999, 2000, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -39,13 +40,11 @@ _IO_old_fgetpos64 (fp, posp)
 #ifdef _G_LSEEK64
   _IO_off64_t pos;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   pos = _IO_seekoff_unlocked (fp, 0, _IO_seek_cur, 0);
   if (_IO_in_backup (fp))
     pos -= fp->_IO_save_end - fp->_IO_save_base;
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   if (pos == _IO_pos_BAD)
     {
       /* ANSI explicitly requires setting errno to a positive value on
--- libc/libio/oldiofsetpos.c.jj	2002-11-05 03:25:15.000000000 -0500
+++ libc/libio/oldiofsetpos.c	2003-08-29 09:16:46.000000000 -0400
@@ -1,4 +1,5 @@
-/* Copyright (C) 1993,95,97,98,99,2000,2002 Free Software Foundation, Inc.
+/* Copyright (C) 1993, 1995, 1997, 1998, 1999, 2000, 2002, 2003
+   Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -37,8 +38,7 @@ _IO_old_fsetpos (fp, posp)
 {
   int result;
   CHECK_FILE (fp, EOF);
-  _IO_cleanup_region_start ((void (*) __P ((void *))) _IO_funlockfile, fp);
-  _IO_flockfile (fp);
+  _IO_acquire_lock (fp);
   if (_IO_seekpos_unlocked (fp, posp->__pos, _IOS_INPUT|_IOS_OUTPUT)
       == _IO_pos_BAD)
     {
@@ -52,8 +52,7 @@ _IO_old_fsetpos (fp, posp)
     }
   else
     result = 0;
-  _IO_funlockfile (fp);
-  _IO_cleanup_region_end (0);
+  _IO_release_lock (fp);
   return result;
 }
 
--- libc/sysdeps/generic/bits/stdio-lock.h.jj	2002-12-07 21:25:45.000000000 -0500
+++ libc/sysdeps/generic/bits/stdio-lock.h	2003-08-29 09:32:43.000000000 -0400
@@ -1,5 +1,5 @@
 /* Thread package specific definitions of stream lock type.  Generic version.
-   Copyright (C) 2000, 2001, 2002 Free Software Foundation, Inc.
+   Copyright (C) 2000, 2001, 2002, 2003 Free Software Foundation, Inc.
    This file is part of the GNU C Library.
 
    The GNU C Library is free software; you can redistribute it and/or
@@ -45,5 +45,14 @@ __libc_lock_define_recursive (typedef, _
 #define _IO_cleanup_region_end(_doit) \
   __libc_cleanup_region_end (_doit)
 
+#if defined _LIBC && !defined NOT_IN_libc
+# define _IO_acquire_lock(_fp) \
+  _IO_cleanup_region_start ((void (*) (void *)) _IO_funlockfile, (_fp));      \
+  _IO_flockfile (_fp)
+
+# define _IO_release_lock(_fp) \
+  _IO_funlockfile (_fp);						      \
+  _IO_cleanup_region_end (0)
+#endif
 
 #endif /* bits/stdio-lock.h */

	Jakub


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]