Merge pull request #1857 from slluis/fix-assembly-resolver
[mono.git] / mcs / class / System.Core / System.IO.MemoryMappedFiles / MemoryMappedViewStream.cs
index 745e376e4c377833885a90a717310f3df923232b..6fbaca605f900dd66241e5ed1a6cdbbad3d3f933 100644 (file)
 // WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 //
 
-#if NET_4_0
 
 using System;
 using System.IO;
+using Microsoft.Win32.SafeHandles;
 
 namespace System.IO.MemoryMappedFiles
 {
        public sealed class MemoryMappedViewStream : UnmanagedMemoryStream {
-
-               IntPtr mmap_addr;
-               ulong mmap_size;
+               IntPtr mmap_handle;
                object monitor;
+               long pointerOffset;
 
-               internal MemoryMappedViewStream (FileStream file, long offset, long size, MemoryMappedFileAccess access) {
+               internal MemoryMappedViewStream (IntPtr handle, long offset, long size, MemoryMappedFileAccess access) {
+                       pointerOffset = offset;
                        monitor = new Object ();
-                       if (Environment.OSVersion.Platform < PlatformID.Unix)
-                               throw new NotImplementedException ("Not implemented on windows.");
-                       else
-                               CreateStreamPosix (file, offset, size, access);
+                       CreateStream (handle, offset, size, access);
                }
 
-               unsafe void CreateStreamPosix (FileStream file, long offset, long size, MemoryMappedFileAccess access) {
-                       long fsize = file.Length;
+               public long PointerOffset
+               {
+                       get { return pointerOffset; }
+               }
+
+               public SafeMemoryMappedViewHandle SafeMemoryMappedViewHandle { 
+                       get {
+                               throw new NotImplementedException ();
+                       }
+               }
 
-                       if (size == 0 || size > fsize)
-                               size = fsize;
+               unsafe void CreateStream (IntPtr handle, long offset, long size, MemoryMappedFileAccess access)
+               {
+                       IntPtr base_address;
 
-                       int offset_diff;
+                       MemoryMapImpl.Map (handle, offset, ref size, access, out mmap_handle, out base_address);
 
-                       MemoryMappedFile.MapPosix (file, offset, size, access, out mmap_addr, out offset_diff, out mmap_size);
-                       
                        FileAccess faccess;
-
                        switch (access) {
                        case MemoryMappedFileAccess.ReadWrite:
                                faccess = FileAccess.ReadWrite;
@@ -72,21 +75,24 @@ namespace System.IO.MemoryMappedFiles
                        default:
                                throw new NotImplementedException ("access mode " + access + " not supported.");
                        }
-                       Initialize ((byte*)mmap_addr + offset_diff, size, size, faccess);
+                       Initialize ((byte*)base_address, size, size, faccess);
                }
                 
                protected override void Dispose (bool disposing)
                {
                        base.Dispose (disposing);
                        lock (monitor) {
-                               if (mmap_addr != (IntPtr)(-1)) {
-                                       MemoryMappedFile.UnmapPosix (mmap_addr, mmap_size);
-                                       mmap_addr = (IntPtr)(-1);
+                               if (mmap_handle != (IntPtr)(-1)) {
+                                       MemoryMapImpl.Unmap (mmap_handle);
+                                       mmap_handle = (IntPtr)(-1);
                                }
                        }
                }
 
+               public override void Flush ()
+               {
+                       MemoryMapImpl.Flush (mmap_handle);
+               }
        }
 }
 
-#endif
\ No newline at end of file