You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
{{ message }}
Repository navigation
Commit eced49b
Browse filesBrowse the repository at this point in the historyBrowse files
Shorter sentences and plainer verbs in the README, CHANGELOG, AspNetCore and Micro READMEs; no figure, identifier or link changed. Two factual slips fixed on the way: the Kestrel introduction no longer says every row ran with EnableAsyncMethods = false, and the Micro README's 0 B claim is scoped to the inline None rows.
Copy file name to clipboardExpand all lines: CHANGELOG.md
+3-3Lines changed: 3 additions & 3 deletions
Display the source diff
Display the rich diff
Original file line number
Diff line number
Diff line change
@@ -23,12 +23,12 @@ behaviour: a breaking change to either means a new major version.
23
23
-`Config.SetPreProcessHandler(sessionId, …)` and `Config.SetPostProcessHandler(sessionId, …)`, symmetric with the default-session setters. `Config.SetBeforeProcessHandler(sessionId, …)` remains as an obsolete alias.
24
24
-`protected JsonRpcService(bool autoBind)`: a subclass constructed with `base(false)` binds itself nowhere, for services that a host or an explicit `BindService` call binds.
25
25
-`SECURITY.md` (private vulnerability reporting) and this changelog.
26
-
-`TestServer_Console --scale`: the release gate for the `ProcessAsync` path (the inline rows at 1, 2 and N workers, three paired runs, medians; fails when N/1 is below the threshold),`--kestrel [seconds] async`for the host with `EnableAsyncMethods = true`, and `--async` rows for `ProcessAsync` at 1 and 16 workers in the README. The 1.x string overloads' thread-pool benchmark is the `t` menu entry, no longer the default.
26
+
-`TestServer_Console --scale` is the release gate for the `ProcessAsync` path. It measures the inline rows at 1, 2 and N workers in three paired runs, takes the medians and fails when N/1 is below the threshold.`--kestrel [seconds] async`runs the host with `EnableAsyncMethods = true`. The README adds `--async` rows for `ProcessAsync` at 1 and 16 workers. The 1.x string overloads' thread-pool benchmark is now the `t` menu entry and no longer the default.
27
27
28
28
### Changed
29
29
30
30
- The core no longer depends on Json.NET.
31
-
-`ProcessAsync` no longer serializes the process on one lock per document. The async scratch (input copy, reader, staged output) is cached one per thread in front of the shared pool, which is now the miss and overflow path only; on 16 threads the inline rows went from about 4 M to 22 M to 32 M RPC/s and a real suspension from 3.9 M to 9 M. Retention is one scratch per thread that has run `ProcessAsync` plus 64 shared, buffers at most 64 KiB each.
31
+
-`ProcessAsync` no longer serializes the process on one lock per document. Each thread now caches one async scratch (input copy, reader, staged output) in front of the shared pool, which handles only misses and overflow. On 16 threads, the inline rows went from about 4 M to 22 M to 32 M RPC/s, and the row with a real suspension went from 3.9 M to 9 M. The library retains one scratch per thread that has run `ProcessAsync` plus 64 shared, with buffers at most 64 KiB each.
32
32
- The request path looks sessions up without creating them. A request for a session id that was never registered answers `-32601` for every call and leaves the registry untouched; sessions are created by binding and by the per-session `Config` setters. Registration adds the session before publishing the registry version, so a thread that misses its snapshot consults the master registry and cannot answer `-32601` for a session that exists.
33
33
- The AspNetCore host binds every registered service, `JsonRpcService` subclasses included, to its effective session (the registration's session, then `JsonRpcOptions.SessionId`, then the default). It no longer skips a subclass on the default session.
34
34
- The core package's description says "no JSON library dependency" instead of "no dependencies". The session registry uses the framework's `ConcurrentDictionary`; the `NonBlocking` package reference is gone, so the core has no dependencies on `net8.0` and `net10.0` (measured with `SessionRegistryBenchmarks`: unknown-id lookups and register/destroy cycles got faster, stable lookups and dispatch are unchanged).
@@ -49,7 +49,7 @@ behaviour: a breaking change to either means a new major version.
49
49
50
50
- A trailing notification in a batch no longer leaves a dangling comma.
51
51
-`async void` methods are rejected at registration.
52
-
- A method registered with `RpcContextFlow.Flow` that suspends under a pre- or post-processing hook and completes on another thread no longer hands that thread the frame of the thread that started it. Afterwards the two threads shared one frame, so `RpcContext`, `RpcRequestId` and `RpcSetException` on either could read or clear the other's while both dispatched. Found by the new cross-thread `ProcessAsync` test; the frame is now restored through the ambient value alone.
52
+
- A method registered with `RpcContextFlow.Flow` that suspends under a pre- or post-processing hook and completes on another thread no longer gives the completing thread the starting thread's frame. Previously, the two threads then shared one frame, so `RpcContext`, `RpcRequestId` and `RpcSetException` on either could read or clear the other's state during concurrent dispatch. The new cross-thread `ProcessAsync` test found this bug. The frame is now restored through the ambient value alone.
0 commit comments