* 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
+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.
--- /dev/null
+//
+// 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
+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.
using System.IO;
using System.Collections.Generic;
using Microsoft.Win32.SafeHandles;
+using Mono.Unix.Native;
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 () {
}
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);
+ }
+
}
}
--- /dev/null
+//
+// 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
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;
}
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) {
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);
}
}
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
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