Remove OSX FileStream Lock/Unlock
authorIan Hays <ianha@microsoft.com>
Thu, 23 Feb 2017 22:46:15 +0000 (14:46 -0800)
committerIan Hays <ianha@microsoft.com>
Fri, 24 Feb 2017 18:44:02 +0000 (10:44 -0800)
OSX doesn't support usage of both fcntl and flock. Since we're already using one in FileShare for the entire file, we cannot enable partial file locking like we do on other Unix platforms. The alternative is to throw a PNSE and suggest using FileShare on the whole file instead.

Commit migrated from https://github.com/dotnet/coreclr/commit/0daa63e9ed40323b6f248ded8959530ea94f19aa

src/coreclr/src/mscorlib/System.Private.CoreLib.csproj
src/coreclr/src/mscorlib/corefx/System/IO/FileStream.Linux.cs [new file with mode: 0644]
src/coreclr/src/mscorlib/corefx/System/IO/FileStream.OSX.cs [new file with mode: 0644]
src/coreclr/src/mscorlib/corefx/System/IO/FileStream.Unix.cs
src/coreclr/src/mscorlib/src/System.Private.CoreLib.txt

index 8162956..415d04b 100644 (file)
     <MscorlibSources Include="$(CoreFxSourcesRoot)\Microsoft\Win32\SafeHandles\SafeFileHandle.Unix.cs" />
     <MscorlibSources Include="$(CoreFxSourcesRoot)\System\IO\FileStream.Unix.cs" />
   </ItemGroup>
+  <ItemGroup Condition="'$(TargetsUnix)' == 'true' and '$(TargetsOSX)' == 'true'">
+    <MscorlibSources Include="$(CoreFxSourcesRoot)\System\IO\FileStream.OSX.cs" />
+  </ItemGroup>
+  <ItemGroup Condition="'$(TargetsUnix)' == 'true' and '$(TargetsOSX)' != 'true'">
+    <MscorlibSources Include="$(CoreFxSourcesRoot)\System\IO\FileStream.Linux.cs" />
+  </ItemGroup>
   <ItemGroup Condition="'$(TargetsUnix)' != 'true'">
     <MscorlibSources Include="$(CoreFxSourcesRoot)\Microsoft\Win32\SafeHandles\SafeFileHandle.Windows.cs" />
     <MscorlibSources Include="$(CoreFxSourcesRoot)\System\IO\FileStream.Win32.cs" />
diff --git a/src/coreclr/src/mscorlib/corefx/System/IO/FileStream.Linux.cs b/src/coreclr/src/mscorlib/corefx/System/IO/FileStream.Linux.cs
new file mode 100644 (file)
index 0000000..873c4eb
--- /dev/null
@@ -0,0 +1,30 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+using Microsoft.Win32.SafeHandles;
+using System.Diagnostics;
+using System.Threading;
+using System.Threading.Tasks;
+
+namespace System.IO
+{
+    public partial class FileStream : Stream
+    {
+        /// <summary>Prevents other processes from reading from or writing to the FileStream.</summary>
+        /// <param name="position">The beginning of the range to lock.</param>
+        /// <param name="length">The range to be locked.</param>
+        private void LockInternal(long position, long length)
+        {
+            CheckFileCall(Interop.Sys.LockFileRegion(_fileHandle, position, length, Interop.Sys.LockType.F_WRLCK));
+        }
+
+        /// <summary>Allows access by other processes to all or part of a file that was previously locked.</summary>
+        /// <param name="position">The beginning of the range to unlock.</param>
+        /// <param name="length">The range to be unlocked.</param>
+        private void UnlockInternal(long position, long length)
+        {
+            CheckFileCall(Interop.Sys.LockFileRegion(_fileHandle, position, length, Interop.Sys.LockType.F_UNLCK));
+        }
+    }
+}
diff --git a/src/coreclr/src/mscorlib/corefx/System/IO/FileStream.OSX.cs b/src/coreclr/src/mscorlib/corefx/System/IO/FileStream.OSX.cs
new file mode 100644 (file)
index 0000000..a1167bf
--- /dev/null
@@ -0,0 +1,19 @@
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace System.IO
+{
+    public partial class FileStream : Stream
+    {
+        private void LockInternal(long position, long length)
+        {
+            throw new PlatformNotSupportedException(Environment.GetResourceString("PlatformNotSupported_OSXFileLocking"));
+        }
+
+        private void UnlockInternal(long position, long length)
+        {
+            throw new PlatformNotSupportedException(Environment.GetResourceString("PlatformNotSupported_OSXFileLocking"));
+        }
+    }
+}
index f83fc84..87bcc6c 100644 (file)
@@ -796,22 +796,6 @@ namespace System.IO
             }
         }
 
-        /// <summary>Prevents other processes from reading from or writing to the FileStream.</summary>
-        /// <param name="position">The beginning of the range to lock.</param>
-        /// <param name="length">The range to be locked.</param>
-        private void LockInternal(long position, long length)
-        {
-            CheckFileCall(Interop.Sys.LockFileRegion(_fileHandle, position, length, Interop.Sys.LockType.F_WRLCK));
-        }
-
-        /// <summary>Allows access by other processes to all or part of a file that was previously locked.</summary>
-        /// <param name="position">The beginning of the range to unlock.</param>
-        /// <param name="length">The range to be unlocked.</param>
-        private void UnlockInternal(long position, long length)
-        {
-            CheckFileCall(Interop.Sys.LockFileRegion(_fileHandle, position, length, Interop.Sys.LockType.F_UNLCK));
-        }
-
         /// <summary>Sets the current position of this stream to the given value.</summary>
         /// <param name="offset">The point relative to origin from which to begin seeking. </param>
         /// <param name="origin">
index e45de2d..15fcf57 100644 (file)
@@ -1719,6 +1719,8 @@ event_Barrier_PhaseFinished=Barrier finishing phase {1}.
 ; Unix threading
 PlatformNotSupported_NamedSynchronizationPrimitives=The named version of this synchronization primitive is not supported on this platform.
 PlatformNotSupported_NamedSyncObjectWaitAnyWaitAll=Wait operations on multiple wait handles including a named synchronization primitive are not supported on this platform.
+; OSX File locking
+PlatformNotSupported_OSXFileLocking=Locking/unlocking file regions is not supported. Use FileShare on the entire file instead.
 #endif
 
 ;