* 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:
		| @@ -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>, | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user