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