diff --git a/include/ChangeLog b/include/ChangeLog index 2ddc1d4209..08a124a855 100644 --- a/include/ChangeLog +++ b/include/ChangeLog @@ -1,3 +1,7 @@ +2005-04-16 Kaveh R. Ghazi + + * libiberty.h (unlock_stream): New. + 2005-04-13 Kaveh R. Ghazi * libiberty.h (fopen_unlocked, fdopen_unlocked, freopen_unlocked): diff --git a/include/libiberty.h b/include/libiberty.h index 671a1239c6..8254aafab0 100644 --- a/include/libiberty.h +++ b/include/libiberty.h @@ -48,6 +48,12 @@ extern "C" { #include +/* 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 72b421b54d..a92bcdc76d 100644 --- a/libiberty/ChangeLog +++ b/libiberty/ChangeLog @@ -1,3 +1,10 @@ +2005-04-16 Kaveh R. Ghazi + + * fopen_unlocked.c (unlock_stream): New. + Consolidate unlocking code into a helper function. + + * functions.texi: Regenerate. + 2005-04-13 Gabriel Dos Reis * asprintf.c: Include config.h. diff --git a/libiberty/fopen_unlocked.c b/libiberty/fopen_unlocked.c index b193dfd908..8f9f300d10 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 47d40ec49f..e55d2d50e7 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})