anchor.diff:      with
       interface System.IDisposable with
           member x.Dispose() =
  -            x.Subject.Dispose()
  +                x.Subject.OnCompleted() // Tell our listeners we're done!
  +                x.Subject.Dispose()
  +                // Don't Dispose() Trace, because that should live on until we call Monitor.stop.
   
   let (|Null|Value|) (x: System.Nullable<_>) =
       // Apparently GetValueOrDefault is faster, and the Unchecked.defaultof<> cannot
  
positive.code: open Microsoft.Diagnostics.Tracing
  open Microsoft.Diagnostics.Tracing.Session
  open System.Reactive.Subjects
  
  // Do we need unique sessions for azmon processes? (difficult to clean up)
  // Should we use unique sessions for sets of sources? So should azmon processes
  // listening to Foo and Bar events share the same session? (difficult to clean up)
  // Keeping the session alive's useful for protecting against azmon crashes
  // Do TraceEventSessions survive reboots? (Probably not: other kernel objects like
  // monitors & sockets don't)
  
  // Problems:
  //* Tests are SUPER flaky
  
negative.code: // providers (event source names), and every time we pick up a message, we
  // push it to the returned IObservable.
  //
  // This ETW session is shared across all running azmon processes. The Session
  // instance returned will stop sending events when it is Dispose()d.
  let start name (names: string list) =
      let sess = createSession name
      enableProviders names sess
  