* 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:
parent
fc316f3a8e
commit
000e74dfd5
@ -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
|
||||
|
@ -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;
|
||||
|
@ -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>,
|
||||
|
Loading…
x
Reference in New Issue
Block a user