* autoload.cc (CancelSynchronousIo): Define.

* fcntl.cc (fcntl64): Drop handling of locking commands.
	* fhandler.h (class fhandler_disk_file): Add mandatory_locking.
	(fhandler_disk_file::fcntl): Declare.
	(fhandler_disk_file::mand_lock): Declare.
	* fhandler_disk_file.cc (fhandler_disk_file::fhandler_disk_file):
	Initialize mandatory_locking.
	(fhandler_disk_file::fcntl): New method.  Handle F_LCK_MANDATORY and
	locking commands.
	(fhandler_disk_file::dup): Duplicate mandatory_locking.  Fix a bug
	when duplicating prw_handle failed.
	(fhandler_disk_file::fixup_after_fork): Reset mandatory_locking.
	* flock.cc (fhandler_disk_file::lock): Add comment.
	(struct lock_parms): New struct to pass parameters to blocking_lock_thr
	thread function.
	(blocking_lock_thr): New thread function.
	(fhandler_disk_file::mand_lock): New methof implementing mandatory
	locking with Windows semantics.
	* ntdll.h (NtLockFile): Declare.
	(NtUnlockFile): Declare.
	* include/fcntl.h: Fix a comment.
	(F_LCK_MANDATORY): Define.  Add lengthy comment to explain.
This commit is contained in:
Corinna Vinschen
2013-06-02 10:22:14 +00:00
parent fa35814af1
commit a24ad2c346
9 changed files with 289 additions and 16 deletions

View File

@ -1,6 +1,6 @@
/* fcntl.h
Copyright 1996, 1998, 2000, 2001, 2005, 2006, 2009, 2010 Red Hat, Inc.
Copyright 1996, 1998, 2000, 2001, 2005, 2006, 2009, 2010, 2013 Red Hat, Inc.
This file is part of Cygwin.
@ -14,12 +14,29 @@ details. */
#include <sys/fcntl.h>
#define O_NDELAY _FNDELAY
/* sys/fcntl defines values up to 0x40000 (O_NOINHERIT). */
/* sys/_default_fcntl.h defines values up to 0x40000 (O_NOINHERIT). */
#define _FDIRECT 0x80000
#define _FNOFOLLOW 0x100000
#define _FDIRECTORY 0x200000
#define _FEXECSRCH 0x400000
/* F_LCK_MANDATORY: Request mandatory locks for this file descriptor.
Cygwin extension to fcntl file locking mechanism. By default, fcntl file
locks are advisory locks. This works nicely as long as only Cygwin
processes interact. If you have the requirement to interact with native
Windows applications which use Windows mandatory file locking, your have
to use mandatory locking as well. The command
fcntl (fd, F_LCK_MANDATORY, 1)
switches subsequent F_GETLK, F_SETLK, F_SETLKW calls to mandatory locking
for this file descriptor and subsequently duplicated ones WITHIN THE SAME
PROCESS. Note that mandatory locks are NOT inherited by child processes,
nor do they survive an execve call. This fully corresponds to Windows
mandatory locking semantics. */
#define F_LCK_MANDATORY 0x99
/* POSIX-1.2008 requires this flag and allows to set it to 0 if its
functionality is not required. */
#define O_TTY_INIT 0