protected override void CleanUpResources() { try { NewMessageSignal.Set(); } finally { base.CleanUpResources(); } }
public unsafe void Write(byte[] data) { lock (DisposeLock) // If there are multiple threads, write just one message at a time { AssertSafe(); if (data.Length > Length - Offset - 8) { // Not enough space left in the shared memory buffer to write the message. WriteContinuation(data.Length); } WriteMessage(data); NewMessageSignal.Set(); // Signal reader that a message is available } }
void Go() { int spinCycles = 0; while (true) { int?latestMessageID = GetLatestMessageID(); if (latestMessageID == null) { return; // We've been disposed. } if (latestMessageID > _lastMessageProcessed) { Thread.MemoryBarrier(); // We need this because of lock-free implementation byte[] msg = GetNextMessage(); if (msg == null) { return; } if (msg.Length > 0 && _onMessage != null) { _onMessage(msg); // Zero-length msg will be a buffer continuation } spinCycles = 1000; } if (spinCycles == 0) { NewMessageSignal.WaitOne(); if (IsDisposed) { return; } } else { Thread.MemoryBarrier(); // We need this because of lock-free implementation spinCycles--; } } }
protected override void DisposeCore() { NewMessageSignal.Set(); base.DisposeCore(); }