Project · Load companions

Verify bounded admission and draining

Check twelve deterministic ownership boundaries without pretending to benchmark a server.

All C# source files below are loaded together in the playground. Files written by a run live in its virtual directory.

Program.cs

AdmissionChecks.Run();

Domain/AdmissionModel.cs

public enum Admission { Active, Queued, Rejected }
public sealed class AdmissionModel {
    private readonly int workers, capacity;
    private readonly Queue<int> waiting = new();
    public int Active { get; private set; }
    public int Waiting => waiting.Count;
    public bool Accepting { get; private set; } = true;
    public AdmissionModel(int workers, int capacity) { if (workers < 1 || capacity < 0) throw new ArgumentOutOfRangeException(); this.workers = workers; this.capacity = capacity; }
    public Admission Admit(int value) { if (!Accepting) return Admission.Rejected; if (Active < workers) { Active++; return Admission.Active; } if (waiting.Count >= capacity) return Admission.Rejected; waiting.Enqueue(value); return Admission.Queued; }
    public void Drain() => Accepting = false;
    public void CompleteOne() { if (Active == 0) throw new InvalidOperationException("No owned operation"); Active--; if (waiting.Count > 0) { waiting.Dequeue(); Active++; } }
}

Checks/AdmissionChecks.cs

public static class AdmissionChecks {
    public static void Run() {
        var model = new AdmissionModel(2, 3); int checks = 0;
        void Check(bool condition) { if (!condition) throw new Exception("Independent admission expectation failed"); checks++; }
        Check(model.Admit(1) == Admission.Active);
        Check(model.Admit(2) == Admission.Active);
        Check(model.Admit(3) == Admission.Queued);
        Check(model.Admit(4) == Admission.Queued);
        Check(model.Admit(5) == Admission.Queued);
        Check(model.Admit(6) == Admission.Rejected);
        Check(model.Active == 2 && model.Waiting == 3);
        model.Drain(); Check(!model.Accepting && model.Admit(7) == Admission.Rejected);
        model.CompleteOne(); Check(model.Active == 2 && model.Waiting == 2);
        for (int i = 0; i < 4; i++) model.CompleteOne(); Check(model.Active == 0 && model.Waiting == 0);
        try { model.CompleteOne(); throw new Exception("Unowned completion accepted"); } catch (InvalidOperationException) { checks++; }
        try { _ = new AdmissionModel(0, 1); throw new Exception("Invalid configuration accepted"); } catch (ArgumentOutOfRangeException) { checks++; }
        Console.WriteLine("admission checks:" + checks); Console.WriteLine("evidence:deterministic model");
    }
}

Admission.csproj

<Project Sdk="Microsoft.NET.Sdk"><PropertyGroup><OutputType>Exe</OutputType><TargetFramework>net9.0</TargetFramework><ImplicitUsings>enable</ImplicitUsings><Nullable>enable</Nullable></PropertyGroup></Project>