* 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.
This commit is contained in:
Corinna Vinschen
2009-04-20 17:13:19 +00:00
parent b978c43ea0
commit 5698171a3f
2 changed files with 14 additions and 0 deletions

View 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 ();
}
}