From a5a5a70b473aad40e23ff9cd7ff1fd952fcbaf68 Mon Sep 17 00:00:00 2001 From: TIHan Date: Thu, 16 Jan 2020 12:30:40 -0800 Subject: [PATCH 1/4] Remove Finalize on obj holder for RawByteMemory as memory mapped files use a safe handler. --- src/absil/bytes.fs | 11 +---------- 1 file changed, 1 insertion(+), 10 deletions(-) diff --git a/src/absil/bytes.fs b/src/absil/bytes.fs index 9ec17577937..012d6d626ec 100644 --- a/src/absil/bytes.fs +++ b/src/absil/bytes.fs @@ -312,16 +312,7 @@ type ByteMemory with | _ when not accessor.CanRead || not accessor.CanWrite -> failwith "Cannot read or write file" | _ -> () - let safeHolder = - { new obj() with - override x.Finalize() = - (x :?> IDisposable).Dispose() - interface IDisposable with - member x.Dispose() = - GC.SuppressFinalize x - accessor.Dispose() - mmf.Dispose() } - RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, safeHolder) + RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, (accessor, mmf)) static member FromUnsafePointer(addr, length, hold: obj) = RawByteMemory(NativePtr.ofNativeInt addr, length, hold) :> ByteMemory From bee6b152fb2209e641bd9b7a31aa2e81bf103876 Mon Sep 17 00:00:00 2001 From: TIHan Date: Thu, 16 Jan 2020 12:56:34 -0800 Subject: [PATCH 2/4] Removed Finalize from SafeUnamanagedMemoryStream as it is an impl detail for viewing RawByteMemory as a stream --- src/absil/bytes.fs | 51 ++++++++++++++++----------------------------- src/absil/bytes.fsi | 2 +- 2 files changed, 19 insertions(+), 34 deletions(-) diff --git a/src/absil/bytes.fs b/src/absil/bytes.fs index 012d6d626ec..4e11002ab1e 100644 --- a/src/absil/bytes.fs +++ b/src/absil/bytes.fs @@ -120,34 +120,29 @@ type ByteArrayMemory(bytes: byte[], offset, length) = type SafeUnmanagedMemoryStream = inherit UnmanagedMemoryStream - val mutable private hold: obj + val mutable private holder: obj val mutable private isDisposed: bool - new (addr, length, hold) = + new (addr, length, holder) = { inherit UnmanagedMemoryStream(addr, length) - hold = hold + holder = holder isDisposed = false } - new (addr: nativeptr, length: int64, capacity: int64, access: FileAccess, hold) = + new (addr: nativeptr, length: int64, capacity: int64, access: FileAccess, holder) = { inherit UnmanagedMemoryStream(addr, length, capacity, access) - hold = hold + holder = holder isDisposed = false } - override x.Finalize() = - x.Dispose false - override x.Dispose disposing = base.Dispose disposing - if not x.isDisposed then - x.hold <- null // Null out so it can be collected. - x.isDisposed <- true + x.holder <- null // Null out so it can be collected. [] -type RawByteMemory(addr: nativeptr, length: int, hold: obj) = +type RawByteMemory(addr: nativeptr, length: int, holder: obj) = inherit ByteMemory () let check i = @@ -159,7 +154,7 @@ type RawByteMemory(addr: nativeptr, length: int, hold: obj) = raise (ArgumentOutOfRangeException("length")) override _.Item - with get i = + with get i = check i NativePtr.add addr i |> NativePtr.read @@ -174,7 +169,7 @@ type RawByteMemory(addr: nativeptr, length: int, hold: obj) = check (pos + count - 1) System.Text.Encoding.UTF8.GetString(NativePtr.add addr pos, count) - override _.ReadBytes(pos, count) = + override _.ReadBytes(pos, count) = check pos check (pos + count - 1) let res = Bytes.zeroCreate count @@ -194,7 +189,7 @@ type RawByteMemory(addr: nativeptr, length: int, hold: obj) = override _.Slice(pos, count) = check pos check (pos + count - 1) - RawByteMemory(NativePtr.add addr pos, count, hold) :> ByteMemory + new RawByteMemory(NativePtr.add addr pos, count, holder) :> ByteMemory override x.CopyTo stream = use stream2 = x.AsStream() @@ -209,11 +204,11 @@ type RawByteMemory(addr: nativeptr, length: int, hold: obj) = Marshal.Copy(NativePtr.toNativeInt addr, res, 0, res.Length) res - override _.AsStream() = - new SafeUnmanagedMemoryStream(addr, int64 length, hold) :> Stream + override this.AsStream() = + new SafeUnmanagedMemoryStream(addr, int64 length, holder) :> Stream - override _.AsReadOnlyStream() = - new SafeUnmanagedMemoryStream(addr, int64 length, int64 length, FileAccess.Read, hold) :> Stream + override this.AsReadOnlyStream() = + new SafeUnmanagedMemoryStream(addr, int64 length, int64 length, FileAccess.Read, holder) :> Stream [] type ReadOnlyByteMemory(bytes: ByteMemory) = @@ -259,17 +254,7 @@ type ByteMemory with mmf let accessor = mmf.CreateViewAccessor(0L, length, MemoryMappedFileAccess.ReadWrite) - - let safeHolder = - { new obj() with - override x.Finalize() = - (x :?> IDisposable).Dispose() - interface IDisposable with - member x.Dispose() = - GC.SuppressFinalize x - accessor.Dispose() - mmf.Dispose() } - RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, safeHolder) + RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, (mmf, accessor)) static member FromFile(path, access, ?canShadowCopy: bool) = let canShadowCopy = defaultArg canShadowCopy false @@ -312,10 +297,10 @@ type ByteMemory with | _ when not accessor.CanRead || not accessor.CanWrite -> failwith "Cannot read or write file" | _ -> () - RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, (accessor, mmf)) + RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, (mmf, accessor)) - static member FromUnsafePointer(addr, length, hold: obj) = - RawByteMemory(NativePtr.ofNativeInt addr, length, hold) :> ByteMemory + static member FromUnsafePointer(addr, length, holder: obj) = + new RawByteMemory(NativePtr.ofNativeInt addr, length, holder) :> ByteMemory static member FromArray(bytes, offset, length) = ByteArrayMemory(bytes, offset, length) :> ByteMemory diff --git a/src/absil/bytes.fsi b/src/absil/bytes.fsi index 11e7c9f58cc..46b30b6c5a4 100644 --- a/src/absil/bytes.fsi +++ b/src/absil/bytes.fsi @@ -95,7 +95,7 @@ type ByteMemory with /// Creates a ByteMemory object that is backed by a raw pointer. /// Use with care. - static member FromUnsafePointer: addr: nativeint * length: int * hold: obj -> ByteMemory + static member FromUnsafePointer: addr: nativeint * length: int * holder: obj -> ByteMemory /// Creates a ByteMemory object that is backed by a byte array with the specified offset and length. static member FromArray: bytes: byte[] * offset: int * length: int -> ByteMemory From 16615595f5224366175395dfae86a245b8f6bf47 Mon Sep 17 00:00:00 2001 From: TIHan Date: Thu, 16 Jan 2020 12:57:50 -0800 Subject: [PATCH 3/4] Remove new --- src/absil/bytes.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/absil/bytes.fs b/src/absil/bytes.fs index 4e11002ab1e..b9d2a9d2c81 100644 --- a/src/absil/bytes.fs +++ b/src/absil/bytes.fs @@ -189,7 +189,7 @@ type RawByteMemory(addr: nativeptr, length: int, holder: obj) = override _.Slice(pos, count) = check pos check (pos + count - 1) - new RawByteMemory(NativePtr.add addr pos, count, holder) :> ByteMemory + RawByteMemory(NativePtr.add addr pos, count, holder) :> ByteMemory override x.CopyTo stream = use stream2 = x.AsStream() @@ -300,7 +300,7 @@ type ByteMemory with RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, (mmf, accessor)) static member FromUnsafePointer(addr, length, holder: obj) = - new RawByteMemory(NativePtr.ofNativeInt addr, length, holder) :> ByteMemory + RawByteMemory(NativePtr.ofNativeInt addr, length, holder) :> ByteMemory static member FromArray(bytes, offset, length) = ByteArrayMemory(bytes, offset, length) :> ByteMemory From 48c6c9e37a1b773e6b38bd62af952872e3da2658 Mon Sep 17 00:00:00 2001 From: Will Smith Date: Fri, 17 Jan 2020 14:26:36 -0800 Subject: [PATCH 4/4] Update bytes.fs --- src/absil/bytes.fs | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/absil/bytes.fs b/src/absil/bytes.fs index b9d2a9d2c81..49fd654827c 100644 --- a/src/absil/bytes.fs +++ b/src/absil/bytes.fs @@ -204,10 +204,10 @@ type RawByteMemory(addr: nativeptr, length: int, holder: obj) = Marshal.Copy(NativePtr.toNativeInt addr, res, 0, res.Length) res - override this.AsStream() = + override _.AsStream() = new SafeUnmanagedMemoryStream(addr, int64 length, holder) :> Stream - override this.AsReadOnlyStream() = + override _.AsReadOnlyStream() = new SafeUnmanagedMemoryStream(addr, int64 length, int64 length, FileAccess.Read, holder) :> Stream []