2009-09-05 Zoltan Varga <vargaz@gmail.com>
authorZoltan Varga <vargaz@gmail.com>
Fri, 4 Sep 2009 22:22:58 +0000 (22:22 -0000)
committerZoltan Varga <vargaz@gmail.com>
Fri, 4 Sep 2009 22:22:58 +0000 (22:22 -0000)
* MemoryMappedViewAccessor.cs: New net 4.0 class.

* MemoryMappedViewStream.cs: Move the mmap code to MemoryMappedFile.cs,
so it can be used by ViewAccessor as well.

svn path=/trunk/mcs/; revision=141375

mcs/class/System.Core/Microsoft.Win32.SafeHandles/ChangeLog
mcs/class/System.Core/Microsoft.Win32.SafeHandles/SafeMemoryMappedViewHandle.cs [new file with mode: 0644]
mcs/class/System.Core/System.IO.MemoryMappedFiles/ChangeLog
mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedFile.cs
mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewAccessor.cs [new file with mode: 0644]
mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewStream.cs
mcs/class/System.Core/net_4_0_System.Core.dll.sources

index 951b5b0f9218de91ee25003292dcc2605cf81ea5..857d1ebc103e544eefcf79edf9c152290b4eae85 100755 (executable)
@@ -1,3 +1,7 @@
+2009-09-05  Zoltan Varga  <vargaz@gmail.com>
+
+       * SafeMemoryMappedViewHandle.cs: New net 4.0 file.
+
 2009-08-18  Atsushi Enomoto  <atsushi@ximian.com>
 
        * SafePipeHandle.cs : initial code.
diff --git a/mcs/class/System.Core/Microsoft.Win32.SafeHandles/SafeMemoryMappedViewHandle.cs b/mcs/class/System.Core/Microsoft.Win32.SafeHandles/SafeMemoryMappedViewHandle.cs
new file mode 100644 (file)
index 0000000..59f79e6
--- /dev/null
@@ -0,0 +1,52 @@
+//
+// SafeMemoryMappedViewHandle.cs
+//
+// Authors:
+//     Zoltan Varga (vargaz@gmail.com)
+//
+// Copyright (C) 2009, Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_4_0
+
+using System;
+using System.IO;
+using System.Runtime.InteropServices;
+using Microsoft.Win32.SafeHandles;
+
+namespace Microsoft.Win32.SafeHandles
+{
+       public sealed class SafeMemoryMappedViewHandle : SafeBuffer {
+
+               internal SafeMemoryMappedViewHandle (IntPtr handle, long size) : base (true) {
+                       this.handle = handle;
+                       Initialize ((ulong)size);
+               }
+
+               [MonoTODO]
+               protected override bool ReleaseHandle () {
+                       throw new NotImplementedException ();
+               }
+       }
+}
+
+#endif
\ No newline at end of file
index 7ec75ba9c1f35d341830358a45636e8b86f95051..90705008effd1d77f524727371b137b18ac6d5bb 100644 (file)
@@ -1,3 +1,10 @@
+2009-09-05  Zoltan Varga  <vargaz@gmail.com>
+
+       * MemoryMappedViewAccessor.cs: New net 4.0 class.
+
+       * MemoryMappedViewStream.cs: Move the mmap code to MemoryMappedFile.cs,
+       so it can be used by ViewAccessor as well.
+
 2009-08-30  Zoltan Varga  <vargaz@gmail.com>
 
        * MemoryMappedViewStream.cs: Implement this for unix.
index 79d30a5337f92bcce914c6de427fb5b5021dd1d2..3e0791da2d105f60c500e1c9e983af484ac6f90c 100644 (file)
@@ -32,6 +32,7 @@ using System;
 using System.IO;
 using System.Collections.Generic;
 using Microsoft.Win32.SafeHandles;
+using Mono.Unix.Native;
 
 namespace System.IO.MemoryMappedFiles
 {
@@ -115,6 +116,19 @@ namespace System.IO.MemoryMappedFiles
                        return new MemoryMappedViewStream (stream, offset, size, access);
                }
 
+               public MemoryMappedViewAccessor CreateViewAccessor () {
+                       return CreateViewAccessor (0, 0);
+               }
+
+               public MemoryMappedViewAccessor CreateViewAccessor (long offset, long size) {
+                       return CreateViewAccessor (offset, size, MemoryMappedFileAccess.ReadWrite);
+               }
+
+               [MonoTODO]
+               public MemoryMappedViewAccessor CreateViewAccessor (long offset, long size, MemoryMappedFileAccess access) {
+                       return new MemoryMappedViewAccessor (stream, offset, size, access);
+               }
+
                MemoryMappedFile () {
                }
 
@@ -128,6 +142,38 @@ namespace System.IO.MemoryMappedFiles
                                throw new NotImplementedException ();
                        }
                }
+
+               static int pagesize;
+
+               internal static unsafe void MapPosix (FileStream file, long offset, long size, MemoryMappedFileAccess access, out IntPtr map_addr, out int offset_diff, out ulong map_size) {
+                       if (pagesize == 0)
+                               pagesize = Syscall.getpagesize ();
+
+                       long fsize = file.Length;
+
+                       if (size == 0 || size > fsize)
+                               size = fsize;
+                       
+                       // Align offset
+                       long real_offset = offset & ~(pagesize - 1);
+
+                       offset_diff = (int)(offset - real_offset);
+
+                       // FIXME: Need to determine the unix fd for the file, Handle is only
+                       // equal to it by accident
+                       map_size = (ulong)size;
+                       map_addr = Syscall.mmap (IntPtr.Zero, map_size, MmapProts.PROT_READ, MmapFlags.MAP_SHARED, (int)file.Handle, real_offset);
+                       if (map_addr == (IntPtr)(-1))
+                               throw new IOException ("mmap failed for " + file + "(" + offset + ", " + size + ")");
+               }
+
+               internal static void UnmapPosix (IntPtr map_addr, ulong map_size) {
+                       int err = Syscall.munmap (map_addr, map_size);
+                       if (err != 0)
+                               /* This shouldn't happen */
+                               throw new IOException ("munmap failed for address " + map_addr + ", size=" + map_size);
+               }
+
        }
 }
 
diff --git a/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewAccessor.cs b/mcs/class/System.Core/System.IO.MemoryMappedFiles/MemoryMappedViewAccessor.cs
new file mode 100644 (file)
index 0000000..82f048f
--- /dev/null
@@ -0,0 +1,87 @@
+//
+// MemoryMappedViewAccessor.cs
+//
+// Authors:
+//     Zoltan Varga (vargaz@gmail.com)
+//
+// Copyright (C) 2009, Novell, Inc (http://www.novell.com)
+//
+// Permission is hereby granted, free of charge, to any person obtaining
+// a copy of this software and associated documentation files (the
+// "Software"), to deal in the Software without restriction, including
+// without limitation the rights to use, copy, modify, merge, publish,
+// distribute, sublicense, and/or sell copies of the Software, and to
+// permit persons to whom the Software is furnished to do so, subject to
+// the following conditions:
+//
+// The above copyright notice and this permission notice shall be
+// included in all copies or substantial portions of the Software.
+//
+// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+// NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
+// LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
+// OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
+// WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+//
+
+#if NET_4_0
+
+using System;
+using System.IO;
+using System.Collections.Generic;
+using Microsoft.Win32.SafeHandles;
+
+namespace System.IO.MemoryMappedFiles
+{
+       public class MemoryMappedViewAccessor : IDisposable {
+
+               object monitor;
+               IntPtr mmap_addr;
+               ulong mmap_size;
+               SafeMemoryMappedViewHandle handle;
+
+               internal MemoryMappedViewAccessor (FileStream file, long offset, long size, MemoryMappedFileAccess access) {
+                       monitor = new Object ();
+                       if (Environment.OSVersion.Platform < PlatformID.Unix)
+                               throw new NotImplementedException ("Not implemented on windows.");
+                       else
+                               CreatePosix (file, offset, size, access);
+               }
+
+               unsafe void CreatePosix (FileStream file, long offset, long size, MemoryMappedFileAccess access) {
+                       long fsize = file.Length;
+
+                       if (size == 0 || size > fsize)
+                               size = fsize;
+
+                       int offset_diff;
+
+                       MemoryMappedFile.MapPosix (file, offset, size, access, out mmap_addr, out offset_diff, out mmap_size);
+
+                       handle = new SafeMemoryMappedViewHandle ((IntPtr)((long)mmap_addr + offset_diff), size);
+               }
+
+               public SafeMemoryMappedViewHandle SafeMemoryMappedViewHandle {
+                       get {
+                               return handle;
+                       }
+               }
+
+               public void Dispose () {
+                       Dispose (true);
+               }
+
+               public void Dispose (bool disposing) {
+                       lock (monitor) {
+                               if (mmap_addr != (IntPtr)(-1)) {
+                                       MemoryMappedFile.UnmapPosix (mmap_addr, mmap_size);
+                                       mmap_addr = (IntPtr)(-1);
+                               }
+                       }
+               }
+       }
+}
+
+#endif
\ No newline at end of file
index 7c19cd24bd290ca358a0648d3464046d659c275f..745e376e4c377833885a90a717310f3df923232b 100644 (file)
 
 using System;
 using System.IO;
-using Mono.Unix.Native;
 
 namespace System.IO.MemoryMappedFiles
 {
        public sealed class MemoryMappedViewStream : UnmanagedMemoryStream {
 
-               static int pagesize;
-
                IntPtr mmap_addr;
                ulong mmap_size;
                object monitor;
@@ -51,26 +48,15 @@ namespace System.IO.MemoryMappedFiles
                }
 
                unsafe void CreateStreamPosix (FileStream file, long offset, long size, MemoryMappedFileAccess access) {
-                       if (pagesize == 0)
-                               pagesize = Syscall.getpagesize ();
-
                        long fsize = file.Length;
 
                        if (size == 0 || size > fsize)
                                size = fsize;
-                       
-                       // Align offset
-                       long real_offset = offset & ~(pagesize - 1);
 
-                       int offset_diff = (int)(offset - real_offset);
-
-                       // FIXME: Need to determine the unix fd for the file, Handle is only
-                       // equal to it by accident
-                       mmap_size = (ulong)size;
-                       mmap_addr = Syscall.mmap (IntPtr.Zero, mmap_size, MmapProts.PROT_READ, MmapFlags.MAP_SHARED, (int)file.Handle, real_offset);
-                       if (mmap_addr == (IntPtr)(-1))
-                               throw new IOException ("mmap failed for " + file + "(" + offset + ", " + size + ")");
+                       int offset_diff;
 
+                       MemoryMappedFile.MapPosix (file, offset, size, access, out mmap_addr, out offset_diff, out mmap_size);
+                       
                        FileAccess faccess;
 
                        switch (access) {
@@ -94,10 +80,7 @@ namespace System.IO.MemoryMappedFiles
                        base.Dispose (disposing);
                        lock (monitor) {
                                if (mmap_addr != (IntPtr)(-1)) {
-                                       int err = Syscall.munmap (mmap_addr, mmap_size);
-                                       if (err != 0)
-                                               /* This shouldn't happen */
-                                               throw new IOException ("munmap failed for address " + mmap_addr + ", size=" + mmap_size);
+                                       MemoryMappedFile.UnmapPosix (mmap_addr, mmap_size);
                                        mmap_addr = (IntPtr)(-1);
                                }
                        }
index 5214fa6b7639e72f7e7add108f0222cd77e87188..04283da1219b0204a4510e9163335b9cc403eefe 100644 (file)
@@ -16,6 +16,7 @@ System.IO.MemoryMappedFiles/MemoryMappedFileAccess.cs
 System.IO.MemoryMappedFiles/MemoryMappedFileOptions.cs
 System.IO.MemoryMappedFiles/MemoryMappedFileRights.cs
 System.IO.MemoryMappedFiles/MemoryMappedViewStream.cs
+System.IO.MemoryMappedFiles/MemoryMappedViewAccessor.cs
 System.Runtime.CompilerServices/DynamicAttribute.cs
 System.Runtime.CompilerServices/ExtensionAttribute.cs
 System.Runtime.CompilerServices/IStrongBox.cs
@@ -63,6 +64,7 @@ System.Linq.Expressions/Extensions.cs
 
 Microsoft.Win32.SafeHandles/SafePipeHandle.cs
 Microsoft.Win32.SafeHandles/SafeMemoryMappedFileHandle.cs
+Microsoft.Win32.SafeHandles/SafeMemoryMappedViewHandle.cs
 System.IO.Pipes/AnonymousPipeClientStream.cs
 System.IO.Pipes/AnonymousPipeServerStream.cs
 System.IO.Pipes/NamedPipeClientStream.cs