@@ -116,6 +116,36 @@ type ByteArrayMemory(bytes: byte[], offset, length) =
116
116
override _.AsReadOnlyStream () =
117
117
new MemoryStream( bytes, offset, length, false ) :> Stream
118
118
119
+ [<Sealed>]
120
+ type SafeUnmanagedMemoryStream =
121
+ inherit UnmanagedMemoryStream
122
+
123
+ val mutable private hold : obj
124
+ val mutable private isDisposed : bool
125
+
126
+ new ( addr , length , hold ) =
127
+ {
128
+ inherit UnmanagedMemoryStream( addr, length)
129
+ hold = hold
130
+ isDisposed = false
131
+ }
132
+
133
+ new ( addr : nativeptr < byte >, length : int64 , capacity : int64 , access : FileAccess , hold ) =
134
+ {
135
+ inherit UnmanagedMemoryStream( addr, length, capacity, access)
136
+ hold = hold
137
+ isDisposed = false
138
+ }
139
+
140
+ override x.Finalize () =
141
+ x.Dispose false
142
+
143
+ override x.Dispose disposing =
144
+ base .Dispose disposing
145
+ if not x.isDisposed then
146
+ x.hold <- null // Null out so it can be collected.
147
+ x.isDisposed <- true
148
+
119
149
[<Sealed>]
120
150
type RawByteMemory ( addr : nativeptr < byte >, length : int , hold : obj ) =
121
151
inherit ByteMemory ()
@@ -170,7 +200,7 @@ type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
170
200
use stream2 = x.AsStream()
171
201
stream2.CopyTo stream
172
202
173
- override x .Copy( srcOffset , dest , destOffset , count ) =
203
+ override _ .Copy( srcOffset , dest , destOffset , count ) =
174
204
check srcOffset
175
205
Marshal.Copy( NativePtr.toNativeInt addr + nativeint srcOffset, dest, destOffset, count)
176
206
@@ -180,10 +210,10 @@ type RawByteMemory(addr: nativeptr<byte>, length: int, hold: obj) =
180
210
res
181
211
182
212
override _.AsStream () =
183
- new UnmanagedMemoryStream ( addr, int64 length) :> Stream
213
+ new SafeUnmanagedMemoryStream ( addr, int64 length, hold ) :> Stream
184
214
185
215
override _.AsReadOnlyStream () =
186
- new UnmanagedMemoryStream ( addr, int64 length, int64 length, FileAccess.Read) :> Stream
216
+ new SafeUnmanagedMemoryStream ( addr, int64 length, int64 length, FileAccess.Read, hold ) :> Stream
187
217
188
218
[<Struct; NoEquality; NoComparison>]
189
219
type ReadOnlyByteMemory ( bytes : ByteMemory ) =
0 commit comments