X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=libiberty%2Ffopen_unlocked.c;h=d1f78c46244163829255f71d12df8553930bc2f3;hb=c88960d081f0b37ec03c66a13115e2a68e40d1ad;hp=b193dfd908183a0b41100198364e9c6c3ecbca97;hpb=ac119ae83bf6d1a1fd5f8aa609180dacf220a3e8;p=deliverable%2Fbinutils-gdb.git diff --git a/libiberty/fopen_unlocked.c b/libiberty/fopen_unlocked.c index b193dfd908..d1f78c4624 100644 --- a/libiberty/fopen_unlocked.c +++ b/libiberty/fopen_unlocked.c @@ -1,5 +1,5 @@ /* Implement fopen_unlocked and related functions. - Copyright (C) 2005 Free Software Foundation, Inc. + Copyright (C) 2005, 2011 Free Software Foundation, Inc. Written by Kaveh R. Ghazi . This file is part of the libiberty library. @@ -15,12 +15,29 @@ Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with libiberty; see the file COPYING.LIB. If -not, write to the Free Software Foundation, Inc., 59 Temple Place - Suite 330, -Boston, MA 02111-1307, USA. */ +not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor, +Boston, MA 02110-1301, USA. */ /* -@deftypefn Extension FILE * fopen_unlocked (const char *@var{path}, const char * @var{mode}) +@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 void unlock_std_streams (void) + +If the OS supports it, ensure that the standard I/O streams, +@code{stdin}, @code{stdout} and @code{stderr} are setup to avoid any +multi-threaded locking. Otherwise 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 operating system supports it, ensure that the stream is setup to avoid @@ -29,7 +46,8 @@ unchanged. @end deftypefn -@deftypefn Extension FILE * fdopen_unlocked (int @var{fildes}, const char * @var{mode}) +@deftypefn Extension {FILE *} fdopen_unlocked (int @var{fildes}, @ + const char * @var{mode}) Opens and returns a @code{FILE} pointer via @code{fdopen}. If the operating system supports it, ensure that the stream is setup to avoid @@ -38,7 +56,8 @@ unchanged. @end deftypefn -@deftypefn Extension FILE * freopen_unlocked (const char * @var{path}, const char * @var{mode}, FILE * @var{stream}) +@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 operating system supports it, ensure that the stream is setup to avoid @@ -59,14 +78,37 @@ 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); +} + +void +unlock_std_streams (void) +{ + unlock_1 (stdin); + unlock_1 (stdout); + unlock_1 (stderr); +} + +FILE * +fopen_unlocked (const char *path, const char *mode) +{ + FILE *const fp = fopen (path, mode); + unlock_1 (fp); return fp; } @@ -74,10 +116,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 +124,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; }