diff options
-rw-r--r-- | winsup/cygwin/ChangeLog | 7 | ||||
-rw-r--r-- | winsup/cygwin/fhandler_disk_file.cc | 10 | ||||
-rw-r--r-- | winsup/cygwin/posix.sgml | 26 |
3 files changed, 37 insertions, 6 deletions
diff --git a/winsup/cygwin/ChangeLog b/winsup/cygwin/ChangeLog index 956d10087..23bcb4462 100644 --- a/winsup/cygwin/ChangeLog +++ b/winsup/cygwin/ChangeLog @@ -1,3 +1,10 @@ +2013-06-07 Corinna Vinschen <corinna@vinschen.de> + + * fhandler_disk_file.cc (fhandler_disk_file::pread): Skip to non-atomic + code if mandatory locking is used on this descriptor. Explain why. + (fhandler_disk_file::pwrite): Ditto. + * posix.sgml (std-notes): Extend description of file locking. + 2013-06-06 Corinna Vinschen <corinna@vinschen.de> * exceptions.cc (_cygtls::handle_SIGCONT): Simplify loop waiting for diff --git a/winsup/cygwin/fhandler_disk_file.cc b/winsup/cygwin/fhandler_disk_file.cc index 075eac8ab..018bcc981 100644 --- a/winsup/cygwin/fhandler_disk_file.cc +++ b/winsup/cygwin/fhandler_disk_file.cc @@ -1575,8 +1575,9 @@ fhandler_disk_file::pread (void *buf, size_t count, off_t offset) return -1; } - /* In binary mode, we can use an atomic NtReadFile call. */ - if (rbinary ()) + /* In binary mode, we can use an atomic NtReadFile call. + Windows mandatory locking semantics disallow to use another HANDLE. */ + if (rbinary () && !mandatory_locking ()) { extern int __stdcall is_at_eof (HANDLE h); NTSTATUS status; @@ -1647,8 +1648,9 @@ fhandler_disk_file::pwrite (void *buf, size_t count, off_t offset) return -1; } - /* In binary mode, we can use an atomic NtWriteFile call. */ - if (wbinary ()) + /* In binary mode, we can use an atomic NtWriteFile call. + Windows mandatory locking semantics disallow to use another HANDLE. */ + if (wbinary () && !mandatory_locking ()) { NTSTATUS status; IO_STATUS_BLOCK io; diff --git a/winsup/cygwin/posix.sgml b/winsup/cygwin/posix.sgml index 21fe6ccab..463383e9f 100644 --- a/winsup/cygwin/posix.sgml +++ b/winsup/cygwin/posix.sgml @@ -1467,10 +1467,32 @@ CLOCK_REALTIME and CLOCK_MONOTONIC. <function>clock_setres</function>, <function>clock_settime</function>, and <function>timer_create</function> currently support only CLOCK_REALTIME.</para> +<para>POSIX file locks via <function>fcntl</function> or +<function>lockf</function>, as well as BSD <function>flock</function> locks +are advisory locks. They don't interact with Windows mandatory locks, nor +do POSIX fcntl locks interfere with BSD flock locks or vice versa.</para> + <para>BSD file locks created via <function>flock</function> are only propagated to the direct parent process, not to grand parents or sibling -processes. The locks are only valid in the creating process, its parent, -and subsequently started child processes sharing the same file descriptor. +processes. The locks are only valid in the creating process, its parent +process, and subsequently started child processes sharing the same file +descriptor.</para> + +<para>In very rare circumstances an application would want to use Windows +mandatory locks to interact with non-Cygwin Windows processes accessing the +same file (databases, etc). For these purposes, the entire locking mechanism +(fcntl/flock/lockf) can be switched to Windows mandatory locks on a +per-descriptor/per-process basis. For this purpose, use the call + +<screen> + fcntl (fd, F_LCK_MANDATORY, 1); +</screen> + +After that, all file locks on this descriptor will follow Windows mandatory +record locking semantics: Locks are per-descriptor/per-process; locks are not +propagated to child processes, not even via <function>execve</function>; +no atmoic replacement of read locks with write locks and vice versa on the +same descriptor; locks have to be unlocked exactly as they have been locked. </para> <para><function>fpclassify</function>, <function>isfinite</function>, |