diff options
author | Ulrich Drepper <drepper@gmail.com> | 2011-09-09 16:15:25 -0400 |
---|---|---|
committer | Ulrich Drepper <drepper@gmail.com> | 2011-09-09 16:15:25 -0400 |
commit | f22e10748fbabbf07161eb7a5540b8c0e18553c4 (patch) | |
tree | 3d9d7754fbf7ca9b80bc0d6a87c4be2c1c730e3d /libio | |
parent | f3cdd4674892740f766ea0b5ab5e734e4a028cb0 (diff) | |
download | glibc-f22e10748fbabbf07161eb7a5540b8c0e18553c4.zip glibc-f22e10748fbabbf07161eb7a5540b8c0e18553c4.tar.gz glibc-f22e10748fbabbf07161eb7a5540b8c0e18553c4.tar.bz2 |
Don't lock string streams in stream cleanup code
Diffstat (limited to 'libio')
-rw-r--r-- | libio/genops.c | 18 |
1 files changed, 9 insertions, 9 deletions
diff --git a/libio/genops.c b/libio/genops.c index 481fbc5..5d21c42 100644 --- a/libio/genops.c +++ b/libio/genops.c @@ -1,4 +1,4 @@ -/* Copyright (C) 1993,1995,1997-2002, 2003, 2004, 2006, 2007 +/* Copyright (C) 1993,1995,1997-2002, 2003, 2004, 2006, 2007, 2011 Free Software Foundation, Inc. This file is part of the GNU C Library. @@ -471,7 +471,7 @@ _IO_default_xsputn (f, data, n) f->_IO_write_ptr += count; #endif s += count; - } + } else if (count) { char *p = f->_IO_write_ptr; @@ -479,9 +479,9 @@ _IO_default_xsputn (f, data, n) for (i = count; --i >= 0; ) *p++ = *s++; f->_IO_write_ptr = p; - } + } more -= count; - } + } if (more == 0 || _IO_OVERFLOW (f, (unsigned char) *s++) == EOF) break; more--; @@ -534,9 +534,9 @@ _IO_default_xsgetn (fp, data, n) while (--i >= 0) *s++ = *p++; fp->_IO_read_ptr = p; - } - more -= count; - } + } + more -= count; + } if (more == 0 || __underflow (fp) == EOF) break; } @@ -959,7 +959,7 @@ _IO_unbuffer_write (void) int cnt; #define MAXTRIES 2 for (cnt = 0; cnt < MAXTRIES; ++cnt) - if (_IO_lock_trylock (*fp->_lock) == 0) + if (fp->_lock == NULL || _IO_lock_trylock (*fp->_lock) == 0) break; else /* Give the other thread time to finish up its use of the @@ -978,7 +978,7 @@ _IO_unbuffer_write (void) _IO_SETBUF (fp, NULL, 0); - if (cnt < MAXTRIES) + if (cnt < MAXTRIES && fp->_lock != NULL) _IO_lock_unlock (*fp->_lock); } |