Welcome to mirror list, hosted at ThFree Co, Russian Federation.

cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCorinna Vinschen <corinna@vinschen.de>2009-07-22 19:46:36 +0400
committerCorinna Vinschen <corinna@vinschen.de>2009-07-22 19:46:36 +0400
commit4a77aea0714cf0175279fbf65cdb8322a5af958b (patch)
tree6c49ca63adb99610e12ed93645b40c3ee5153672 /winsup/cygwin/flock.cc
parent1e497ebd33c2e75d6e2a00d438d8012b3f4ab79c (diff)
* fhandler.h (enum del_lock_called_from): New enumeration.
(fhandler_base::del_my_locks): Declare taking a del_lock_called_from as argument. * fhandler.cc (fhandler_base::close): Call del_my_locks with "on_close". (fhandler_base::fixup_after_fork): Call del_my_locks with "after_fork". (fhandler_base::fixup_after_exec): Call del_my_locks with "after_exec". * flock.cc (fhandler_base::del_my_locks): Take del_lock_called_from as argument. Call node->del_my_locks with NULL handle in after_exec case. Explain why.
Diffstat (limited to 'winsup/cygwin/flock.cc')
-rw-r--r--winsup/cygwin/flock.cc14
1 files changed, 12 insertions, 2 deletions
diff --git a/winsup/cygwin/flock.cc b/winsup/cygwin/flock.cc
index 72b9ef447..92b03d51e 100644
--- a/winsup/cygwin/flock.cc
+++ b/winsup/cygwin/flock.cc
@@ -344,14 +344,24 @@ inode_t::del_my_locks (long long id, HANDLE fhdl)
case the close_on_exec flag is set. The whole inode is deleted as
soon as no lock exists on it anymore. */
void
-fhandler_base::del_my_locks (bool after_fork)
+fhandler_base::del_my_locks (del_lock_called_from from)
{
INODE_LIST_LOCK ();
inode_t *node = inode_t::get (get_dev (), get_ino (), false);
if (node)
{
+ /* When we're called from fixup_after_exec, the fhandler is a
+ close-on-exec fhandler. In this case our io handle is already
+ invalid. We can't use it to test for the object reference count.
+ However, that shouldn't be necessary for the following reason.
+ After exec, there are no threads in the current process waiting for
+ the lock. So, either we're the only process accessing the file table
+ entry and there are no threads which require signalling, or we have
+ a parent process still accessing the file object and signalling the
+ lock event would be premature. */
bool no_locks_left =
- node->del_my_locks (after_fork ? 0 : get_unique_id (), get_handle ());
+ node->del_my_locks (from == after_fork ? 0 : get_unique_id (),
+ from == after_exec ? NULL : get_handle ());
if (no_locks_left)
{
LIST_REMOVE (node, i_next);