From 6feaa084f88c96b72f840c2e9ed280fc742b1f98 Mon Sep 17 00:00:00 2001
From: "Kaveh R. Ghazi" <ghazi@caip.rutgers.edu>
Date: Sat, 16 Apr 2005 16:58:35 +0000
Subject: [PATCH] libiberty.h (unlock_stream): New.

include:
	* libiberty.h (unlock_stream): New.

libiberty:
	* fopen_unlocked.c (unlock_stream): New.
	Consolidate unlocking code into a helper function.

	* functions.texi: Regenerate.

From-SVN: r98234
---
 include/ChangeLog          |  4 ++++
 include/libiberty.h        |  6 ++++++
 libiberty/ChangeLog        |  7 +++++++
 libiberty/fopen_unlocked.c | 39 +++++++++++++++++++++++++++-----------
 libiberty/functions.texi   | 15 ++++++++++++---
 5 files changed, 57 insertions(+), 14 deletions(-)

diff --git a/include/ChangeLog b/include/ChangeLog
index 20b17e55e0fe..9f0188e39576 100644
--- a/include/ChangeLog
+++ b/include/ChangeLog
@@ -1,3 +1,7 @@
+2005-04-16  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* libiberty.h (unlock_stream): New.
+
 2005-04-13  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
 
 	* libiberty.h (fopen_unlocked, fdopen_unlocked, freopen_unlocked):
diff --git a/include/libiberty.h b/include/libiberty.h
index 671a1239c65d..8254aafab0fa 100644
--- a/include/libiberty.h
+++ b/include/libiberty.h
@@ -48,6 +48,12 @@ extern "C" {
 
 #include <stdio.h>
 
+/* If the OS supports it, ensure that the supplied stream is setup to
+   avoid any multi-threaded locking.  Otherwise leave the FILE pointer
+   unchanged.  If the stream is NULL do nothing.  */
+
+extern void unlock_stream (FILE *);
+
 /* Open and return a FILE pointer.  If the OS supports it, ensure that
    the stream is setup to avoid any multi-threaded locking.  Otherwise
    return the FILE pointer unchanged.  */
diff --git a/libiberty/ChangeLog b/libiberty/ChangeLog
index 72b421b54dd1..a92bcdc76d78 100644
--- a/libiberty/ChangeLog
+++ b/libiberty/ChangeLog
@@ -1,3 +1,10 @@
+2005-04-16  Kaveh R. Ghazi  <ghazi@caip.rutgers.edu>
+
+	* fopen_unlocked.c (unlock_stream): New.
+	Consolidate unlocking code into a helper function.
+
+	* functions.texi: Regenerate.
+
 2005-04-13  Gabriel Dos Reis  <gdr@integrable-solutions.net>
 
 	* asprintf.c: Include config.h.
diff --git a/libiberty/fopen_unlocked.c b/libiberty/fopen_unlocked.c
index b193dfd90818..8f9f300d1012 100644
--- a/libiberty/fopen_unlocked.c
+++ b/libiberty/fopen_unlocked.c
@@ -20,6 +20,14 @@ Boston, MA 02111-1307, USA.  */
 
 /*
 
+@deftypefn Extension void unlock_stream (FILE * @var{stream})
+
+If the OS supports it, ensure that the supplied stream is setup to
+avoid any multi-threaded locking.  Otherwise leave the @code{FILE}
+pointer unchanged.  If the @var{stream} is @code{NULL} do nothing.
+
+@end deftypefn
+
 @deftypefn Extension FILE * fopen_unlocked (const char *@var{path}, const char * @var{mode})
 
 Opens and returns a @code{FILE} pointer via @code{fopen}.  If the
@@ -59,14 +67,29 @@ unchanged.
 
 #include "libiberty.h"
 
-FILE *
-fopen_unlocked (const char *path, const char *mode)		
+/* This is an inline helper function to consolidate attempts to unlock
+   a stream.  */
+
+static inline void
+unlock_1 (FILE *const fp ATTRIBUTE_UNUSED)
 {
-  FILE *const fp = fopen (path, mode);
 #if defined(HAVE___FSETLOCKING) && defined(FSETLOCKING_BYCALLER)
   if (fp)
     __fsetlocking (fp, FSETLOCKING_BYCALLER);
 #endif
+}
+
+void
+unlock_stream(FILE *fp)
+{
+  unlock_1 (fp);
+}
+
+FILE *
+fopen_unlocked (const char *path, const char *mode)		
+{
+  FILE *const fp = fopen (path, mode);
+  unlock_1 (fp);
   return fp;
 }
 
@@ -74,10 +97,7 @@ FILE *
 fdopen_unlocked (int fildes, const char *mode)
 {
   FILE *const fp = fdopen (fildes, mode);
-#if defined(HAVE___FSETLOCKING) && defined(FSETLOCKING_BYCALLER)
-  if (fp)
-    __fsetlocking (fp, FSETLOCKING_BYCALLER);
-#endif
+  unlock_1 (fp);
   return fp;
 }
 
@@ -85,9 +105,6 @@ FILE *
 freopen_unlocked (const char *path, const char *mode, FILE *stream)
 {
   FILE *const fp = freopen (path, mode, stream);
-#if defined(HAVE___FSETLOCKING) && defined(FSETLOCKING_BYCALLER)
-  if (fp)
-    __fsetlocking (fp, FSETLOCKING_BYCALLER);
-#endif
+  unlock_1 (fp);
   return fp;
 }
diff --git a/libiberty/functions.texi b/libiberty/functions.texi
index 47d40ec49f7b..e55d2d50e715 100644
--- a/libiberty/functions.texi
+++ b/libiberty/functions.texi
@@ -362,7 +362,7 @@ and inode numbers.
 
 @end deftypefn
 
-@c fopen_unlocked.c:32
+@c fopen_unlocked.c:40
 @deftypefn Extension FILE * fdopen_unlocked (int @var{fildes}, const char * @var{mode})
 
 Opens and returns a @code{FILE} pointer via @code{fdopen}.  If the
@@ -431,7 +431,7 @@ Ignores case when performing the comparison.
 
 @end deftypefn
 
-@c fopen_unlocked.c:23
+@c fopen_unlocked.c:31
 @deftypefn Extension FILE * fopen_unlocked (const char *@var{path}, const char * @var{mode})
 
 Opens and returns a @code{FILE} pointer via @code{fopen}.  If the
@@ -451,7 +451,7 @@ itself.
 
 @end deftypefn
 
-@c fopen_unlocked.c:41
+@c fopen_unlocked.c:49
 @deftypefn Extension FILE * freopen_unlocked (const char * @var{path}, const char * @var{mode}, FILE * @var{stream})
 
 Opens and returns a @code{FILE} pointer via @code{freopen}.  If the
@@ -1201,6 +1201,15 @@ was made to unlink the file because it is special.
 
 @end deftypefn
 
+@c fopen_unlocked.c:23
+@deftypefn Extension void unlock_stream (FILE * @var{stream})
+
+If the OS supports it, ensure that the supplied stream is setup to
+avoid any multi-threaded locking.  Otherwise leave the @code{FILE}
+pointer unchanged.  If the @var{stream} is @code{NULL} do nothing.
+
+@end deftypefn
+
 @c vasprintf.c:47
 @deftypefn Extension int vasprintf (char **@var{resptr}, const char *@var{format}, va_list @var{args})
 
-- 
GitLab