-
Notifications
You must be signed in to change notification settings - Fork 824
Closed
Copy link
Labels
Area-Diagnosticsmistakes and possible improvements to diagnosticsmistakes and possible improvements to diagnosticsBugImpact-Low(Internal MS Team use only) Describes an issue with limited impact on existing code.(Internal MS Team use only) Describes an issue with limited impact on existing code.
Milestone
Description
Message:
System.ObjectDisposedException : Cannot access a disposed object.
Object name: 'Microsoft.Win32.SafeHandles.SafeWaitHandle'.
Stack Trace:
SafeHandle.DangerousAddRef(Boolean& success)
Kernel32.SetEvent(SafeWaitHandle handle)
EventWaitHandle.Set()
Mailbox`1.Post(TMsg msg) line 193
FSharpMailboxProcessor`1.Post(TMsg message) line 419
I can see the above exception occasionally in this test:
fsharp/tests/FSharp.Core.UnitTests/FSharp.Core/Microsoft.FSharp.Control/MailboxProcessorType.fs
Line 316 in e6854f5
member this.``After dispose is called, mailbox should stop receiving and processing messages``() = task { |
I assume the expected behavior here is no exception?
I'll try to come up with consistent minimal repro, but the problem seems to be here:
fsharp/src/FSharp.Core/mailbox.fs
Lines 189 to 193 in 69fa88b
match pulse with | |
| null -> () // no one waiting, leaving the message in the queue is sufficient | |
| ev -> | |
// someone is waiting on the wait handle | |
ev.Set() |> ignore |
ev
is disposed and Set
will fail.
The fix seems to be to also assign null to pulse
when disposing it here:
fsharp/src/FSharp.Core/mailbox.fs
Lines 336 to 346 in 69fa88b
interface System.IDisposable with | |
member _.Dispose() = | |
lock syncRoot (fun () -> | |
if isNotNull inboxStore then | |
inboxStore.Clear() | |
arrivals.Clear() | |
isDisposed <- true) | |
if isNotNull pulse then | |
(pulse :> IDisposable).Dispose() |
rstm-sfrstm-sf
Metadata
Metadata
Assignees
Labels
Area-Diagnosticsmistakes and possible improvements to diagnosticsmistakes and possible improvements to diagnosticsBugImpact-Low(Internal MS Team use only) Describes an issue with limited impact on existing code.(Internal MS Team use only) Describes an issue with limited impact on existing code.
Type
Projects
Status
Done