diff --git a/README.md b/README.md index 3d04470..e70c248 100644 --- a/README.md +++ b/README.md @@ -87,8 +87,8 @@ released (Unity: ReflectorNet JSON). ### C# (NuGet) ```xml - - + + ``` diff --git a/dotnet/Directory.Build.props b/dotnet/Directory.Build.props index f6154bc..08ad893 100644 --- a/dotnet/Directory.Build.props +++ b/dotnet/Directory.Build.props @@ -6,7 +6,7 @@ true $(NoWarn);CS1591 true - 0.4.0 + 0.4.1 Ivan Murzak Copyright (c) 2026 Ivan Murzak https://github.com/IvanMurzak/Code-Exec diff --git a/spec/contract.md b/spec/contract.md index 8ce15d9..b2ea83b 100644 --- a/spec/contract.md +++ b/spec/contract.md @@ -304,8 +304,10 @@ Lengths are in characters: UTF-16 code units in C#, code points in Python. A lim ## Changelog -- **Unreleased** — C#: a `Monitor.Pulse` sent while a sliced `Monitor.Wait` is between two slices wakes it (it was - lost, and the waiter slept until the budget); the agent's `Monitor.Pulse` / `PulseAll` become guard stand-ins (§3.6). +- **v0.4.1** — C#: the guard keeps its per-thread state in a `ThreadLocal` instead of a `[ThreadStatic]` field of + the collectible snippet assembly (a rare process crash in the .NET 10 GC went away with it); a `Monitor.Pulse` sent + while a sliced `Monitor.Wait` is between two slices wakes it (it was lost, and the waiter slept until the budget); + the agent's `Monitor.Pulse` / `PulseAll` become guard stand-ins (§3.6). - **v0.4.0** — execution guards (§3.6): C# snippets, full source and includes stop with `Runtime` (`Recursion too deep`) before a stack overflow and with `Timeout` once `timeoutMs` is spent, also in synchronous code on the main thread; Python stops with `Timeout` through a watchdog (§4). `timeoutMs` applies to both runtimes; `0`