Conversation
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
When subscribers contend for the read lock, blocking Dequeue currently yields and progresses to semaphore waits of up to 10 ms. Use bounded SpinWait retries before a 5 ms semaphore wait, resetting the spin budget after waiting. TryDequeue still makes one read-lock attempt, and the existing publisher/subscriber crash recovery remains intact. Also observe cancellation while waiting for a publisher to finish writing a reserved message.
Add eight regression cases covering contended reads, expired read locks, cancellation, and exactly-once delivery with concurrent publishers and subscribers. Add a reproducible concurrent-subscriber benchmark, support benchmark selection from the command line, and update existing benchmark jobs to .NET 10. This branch includes current main and the queue lifetime fix.
Validation:
The benchmark refresh corrects the enqueue operation count and ensures the ring-wrap workload actually crosses the buffer boundary. All seven benchmarks were run directly on an Apple M5 Max with .NET 10, three warm-up iterations, and eight measured iterations. The README includes the native Mac results and full reports; its historical Windows and Linux measurements are unchanged.
These are in-process microbenchmarks. Concurrent delivery measures amortized time per message, including worker startup and completion, rather than individual message latency. Earlier native Mac comparisons against main measured 253.3 → 241.0 ns with one subscriber and 1,505.4 → 342.0 ns with four; those used only three measured iterations and the contended baseline was noisy.
Reproduce all cases from the repository root:
dotnet run --project src/Interprocess.Benchmark -c Release -- --filter '*' --warmupCount 3 --iterationCount 8 --artifacts BenchmarkDotNet.Artifacts