* 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.
This commit is contained in:
Corinna Vinschen 2013-06-07 08:28:25 +00:00
parent fc316f3a8e
commit 000e74dfd5
3 changed files with 37 additions and 6 deletions

View File

@ -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

View File

@ -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;

View File

@ -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>,