about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--ChangeLog6
-rw-r--r--libio/genops.c13
2 files changed, 19 insertions, 0 deletions
diff --git a/ChangeLog b/ChangeLog
index f6b99b654d..bf39f53070 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+2006-01-11  Ulrich Drepper  <drepper@redhat.com>
+
+	* libio/genops.c (_IO_unbuffer_write): Give concurrently running
+	threads the chance to work correctly by trying to lock the stream.
+	If this does not work, proceed without locking.
+
 2006-01-10  Ulrich Drepper  <drepper@redhat.com>
 
 	* libio/genops.c (_IO_unbuffer_write): Don't always free the
diff --git a/libio/genops.c b/libio/genops.c
index 3deb044a08..da29ade4e6 100644
--- a/libio/genops.c
+++ b/libio/genops.c
@@ -947,6 +947,16 @@ _IO_unbuffer_write (void)
 	  /* Iff stream is un-orientated, it wasn't used. */
 	  && fp->_mode != 0)
 	{
+	  int cnt;
+#define MAXTRIES 2
+	  for (cnt = 0; cnt < MAXTRIES; ++cnt)
+	    if (_IO_lock_trylock (*fp->_lock) == 0)
+	      break;
+	    else
+	      /* Give the other thread time to finish up its use of the
+		 stream.  */
+	      __sched_yield ();
+
 	  if (! dealloc_buffers && !(fp->_flags & _IO_USER_BUF))
 	    {
 	      fp->_flags |= _IO_USER_BUF;
@@ -958,6 +968,9 @@ _IO_unbuffer_write (void)
 	    }
 
 	  _IO_SETBUF (fp, NULL, 0);
+
+	  if (cnt < MAXTRIES)
+	    _IO_lock_unlock (*fp->_lock);
 	}
 
       /* Make sure that never again the wide char functions can be