Skip to content

Commit 6edf6ee

Browse files
TIHanbaronfel
authored andcommitted
Remove Finalize on obj holder for RawByteMemory (#8237)
* Remove Finalize on obj holder for RawByteMemory as memory mapped files use a safe handler. * Removed Finalize from SafeUnamanagedMemoryStream as it is an impl detail for viewing RawByteMemory as a stream * Remove new * Update bytes.fs
1 parent eee7567 commit 6edf6ee

File tree

2 files changed

+18
-42
lines changed

2 files changed

+18
-42
lines changed

src/absil/bytes.fs

Lines changed: 17 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -120,34 +120,29 @@ type ByteArrayMemory(bytes: byte[], offset, length) =
120120
type SafeUnmanagedMemoryStream =
121121
inherit UnmanagedMemoryStream
122122

123-
val mutable private hold: obj
123+
val mutable private holder: obj
124124
val mutable private isDisposed: bool
125125

126-
new (addr, length, hold) =
126+
new (addr, length, holder) =
127127
{
128128
inherit UnmanagedMemoryStream(addr, length)
129-
hold = hold
129+
holder = holder
130130
isDisposed = false
131131
}
132132

133-
new (addr: nativeptr<byte>, length: int64, capacity: int64, access: FileAccess, hold) =
133+
new (addr: nativeptr<byte>, length: int64, capacity: int64, access: FileAccess, holder) =
134134
{
135135
inherit UnmanagedMemoryStream(addr, length, capacity, access)
136-
hold = hold
136+
holder = holder
137137
isDisposed = false
138138
}
139139

140-
override x.Finalize() =
141-
x.Dispose false
142-
143140
override x.Dispose disposing =
144141
base.Dispose disposing
145-
if not x.isDisposed then
146-
x.hold <- null // Null out so it can be collected.
147-
x.isDisposed <- true
142+
x.holder <- null // Null out so it can be collected.
148143

149144
[<Sealed>]
150-
type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
145+
type RawByteMemory(addr: nativeptr<byte>, length: int, holder: obj) =
151146
inherit ByteMemory ()
152147

153148
let check i =
@@ -159,7 +154,7 @@ type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
159154
raise (ArgumentOutOfRangeException("length"))
160155

161156
override _.Item
162-
with get i =
157+
with get i =
163158
check i
164159
NativePtr.add addr i
165160
|> NativePtr.read
@@ -174,7 +169,7 @@ type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
174169
check (pos + count - 1)
175170
System.Text.Encoding.UTF8.GetString(NativePtr.add addr pos, count)
176171

177-
override _.ReadBytes(pos, count) =
172+
override _.ReadBytes(pos, count) =
178173
check pos
179174
check (pos + count - 1)
180175
let res = Bytes.zeroCreate count
@@ -194,7 +189,7 @@ type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
194189
override _.Slice(pos, count) =
195190
check pos
196191
check (pos + count - 1)
197-
RawByteMemory(NativePtr.add addr pos, count, hold) :> ByteMemory
192+
RawByteMemory(NativePtr.add addr pos, count, holder) :> ByteMemory
198193

199194
override x.CopyTo stream =
200195
use stream2 = x.AsStream()
@@ -210,10 +205,10 @@ type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
210205
res
211206

212207
override _.AsStream() =
213-
new SafeUnmanagedMemoryStream(addr, int64 length, hold) :> Stream
208+
new SafeUnmanagedMemoryStream(addr, int64 length, holder) :> Stream
214209

215210
override _.AsReadOnlyStream() =
216-
new SafeUnmanagedMemoryStream(addr, int64 length, int64 length, FileAccess.Read, hold) :> Stream
211+
new SafeUnmanagedMemoryStream(addr, int64 length, int64 length, FileAccess.Read, holder) :> Stream
217212

218213
[<Struct;NoEquality;NoComparison>]
219214
type ReadOnlyByteMemory(bytes: ByteMemory) =
@@ -259,17 +254,7 @@ type ByteMemory with
259254
mmf
260255

261256
let accessor = mmf.CreateViewAccessor(0L, length, MemoryMappedFileAccess.ReadWrite)
262-
263-
let safeHolder =
264-
{ new obj() with
265-
override x.Finalize() =
266-
(x :?> IDisposable).Dispose()
267-
interface IDisposable with
268-
member x.Dispose() =
269-
GC.SuppressFinalize x
270-
accessor.Dispose()
271-
mmf.Dispose() }
272-
RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, safeHolder)
257+
RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, (mmf, accessor))
273258

274259
static member FromFile(path, access, ?canShadowCopy: bool) =
275260
let canShadowCopy = defaultArg canShadowCopy false
@@ -313,19 +298,10 @@ type ByteMemory with
313298
| FileAccess.ReadWrite when not accessor.CanRead || not accessor.CanWrite -> invalidOp "Cannot read or write file"
314299
| _ -> ()
315300

316-
let safeHolder =
317-
{ new obj() with
318-
override x.Finalize() =
319-
(x :?> IDisposable).Dispose()
320-
interface IDisposable with
321-
member x.Dispose() =
322-
GC.SuppressFinalize x
323-
accessor.Dispose()
324-
mmf.Dispose() }
325-
RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, safeHolder)
326-
327-
static member FromUnsafePointer(addr, length, hold: obj) =
328-
RawByteMemory(NativePtr.ofNativeInt addr, length, hold) :> ByteMemory
301+
RawByteMemory.FromUnsafePointer(accessor.SafeMemoryMappedViewHandle.DangerousGetHandle(), int length, (mmf, accessor))
302+
303+
static member FromUnsafePointer(addr, length, holder: obj) =
304+
RawByteMemory(NativePtr.ofNativeInt addr, length, holder) :> ByteMemory
329305

330306
static member FromArray(bytes, offset, length) =
331307
ByteArrayMemory(bytes, offset, length) :> ByteMemory

src/absil/bytes.fsi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -95,7 +95,7 @@ type ByteMemory with
9595

9696
/// Creates a ByteMemory object that is backed by a raw pointer.
9797
/// Use with care.
98-
static member FromUnsafePointer: addr: nativeint * length: int * hold: obj -> ByteMemory
98+
static member FromUnsafePointer: addr: nativeint * length: int * holder: obj -> ByteMemory
9999

100100
/// Creates a ByteMemory object that is backed by a byte array with the specified offset and length.
101101
static member FromArray: bytes: byte[] * offset: int * length: int -> ByteMemory

0 commit comments

Comments
 (0)