* 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>
|
2013-06-06 Corinna Vinschen <corinna@vinschen.de>
|
||||||
|
|
||||||
* exceptions.cc (_cygtls::handle_SIGCONT): Simplify loop waiting for
|
* 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;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In binary mode, we can use an atomic NtReadFile call. */
|
/* In binary mode, we can use an atomic NtReadFile call.
|
||||||
if (rbinary ())
|
Windows mandatory locking semantics disallow to use another HANDLE. */
|
||||||
|
if (rbinary () && !mandatory_locking ())
|
||||||
{
|
{
|
||||||
extern int __stdcall is_at_eof (HANDLE h);
|
extern int __stdcall is_at_eof (HANDLE h);
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
@ -1647,8 +1648,9 @@ fhandler_disk_file::pwrite (void *buf, size_t count, off_t offset)
|
|||||||
return -1;
|
return -1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* In binary mode, we can use an atomic NtWriteFile call. */
|
/* In binary mode, we can use an atomic NtWriteFile call.
|
||||||
if (wbinary ())
|
Windows mandatory locking semantics disallow to use another HANDLE. */
|
||||||
|
if (wbinary () && !mandatory_locking ())
|
||||||
{
|
{
|
||||||
NTSTATUS status;
|
NTSTATUS status;
|
||||||
IO_STATUS_BLOCK io;
|
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>
|
<function>clock_settime</function>, and <function>timer_create</function>
|
||||||
currently support only CLOCK_REALTIME.</para>
|
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
|
<para>BSD file locks created via <function>flock</function> are only
|
||||||
propagated to the direct parent process, not to grand parents or sibling
|
propagated to the direct parent process, not to grand parents or sibling
|
||||||
processes. The locks are only valid in the creating process, its parent,
|
processes. The locks are only valid in the creating process, its parent
|
||||||
and subsequently started child processes sharing the same file descriptor.
|
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>
|
||||||
|
|
||||||
<para><function>fpclassify</function>, <function>isfinite</function>,
|
<para><function>fpclassify</function>, <function>isfinite</function>,
|
||||||
|
Loading…
x
Reference in New Issue
Block a user