diff options
author | Corinna Vinschen <corinna@vinschen.de> | 2009-07-22 15:46:36 +0000 |
---|---|---|
committer | Corinna Vinschen <corinna@vinschen.de> | 2009-07-22 15:46:36 +0000 |
commit | 4a77aea0714cf0175279fbf65cdb8322a5af958b (patch) | |
tree | 6c49ca63adb99610e12ed93645b40c3ee5153672 /winsup/cygwin/flock.cc | |
parent | 1e497ebd33c2e75d6e2a00d438d8012b3f4ab79c (diff) | |
download | cygnal-4a77aea0714cf0175279fbf65cdb8322a5af958b.tar.gz cygnal-4a77aea0714cf0175279fbf65cdb8322a5af958b.tar.bz2 cygnal-4a77aea0714cf0175279fbf65cdb8322a5af958b.zip |
* 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.cc | 14 |
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); |