OSDN Git Service

* flock.cc (lf_setlock): Handle border case which results in WFMO loop
authorcorinna <corinna>
Mon, 20 Apr 2009 17:13:19 +0000 (17:13 +0000)
committercorinna <corinna>
Mon, 20 Apr 2009 17:13:19 +0000 (17:13 +0000)
exiting with ret == WAIT_TIMEOUT gracefully.  Add a system_printf to
uncover other potential problems with WFMO loop.

winsup/cygwin/ChangeLog
winsup/cygwin/flock.cc

index 59ac132..47b3efd 100644 (file)
@@ -1,3 +1,9 @@
+2009-04-20  Corinna Vinschen  <corinna@vinschen.de>
+
+       * flock.cc (lf_setlock): Handle border case which results in WFMO loop
+       exiting with ret == WAIT_TIMEOUT gracefully.  Add a system_printf to
+       uncover other potential problems with WFMO loop. 
+
 2009-04-18  Christopher Faylor  <me+cygwin@cgf.cx>
 
        * mkimport: Specify .text for stub explicitly.
index e171660..8fd7139 100644 (file)
@@ -971,6 +971,12 @@ lf_setlock (lockf_t *lock, inode_t *node, lockf_t **clean, HANDLE fhdl)
              ret = WaitForMultipleObjects (2, w4, FALSE, 100L);
            }
          while (ret == WAIT_TIMEOUT && get_obj_handle_count (obj) > 1);
+         /* There's a good chance that the above loop is left with
+            ret == WAIT_TIMEOUT if another process closes the file handle
+            associated with this lock.  This is for all practical purposes
+            equivalent to a signalled lock object. */
+         if (ret == WAIT_TIMEOUT)
+           ret = WAIT_OBJECT_0;
        }
       node->LOCK ();
       node->unwait ();
@@ -991,6 +997,8 @@ lf_setlock (lockf_t *lock, inode_t *node, lockf_t **clean, HANDLE fhdl)
          _my_tls.call_signal_handler ();
          return EINTR;
        default:
+         system_printf ("Shouldn't happen! ret = %lu, error: %lu\n",
+                        ret, GetLastError ());
          return geterrno_from_win_error ();
        }
     }