* libio/genops.c (_IO_unbuffer_write): Give concurrently running
authorUlrich Drepper <drepper@redhat.com>
Wed, 11 Jan 2006 08:10:42 +0000 (08:10 +0000)
committerUlrich Drepper <drepper@redhat.com>
Wed, 11 Jan 2006 08:10:42 +0000 (08:10 +0000)
threads the chance to work correctly by trying to lock the stream.
If this does not work, proceed without locking.

ChangeLog
libio/genops.c

index f6b99b6..bf39f53 100644 (file)
--- 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
index 3deb044..da29ade 100644 (file)
@@ -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