Turn the number of waiters behind a held guard into an enter, backoff, or page remediation action.

guard contention The waiter count behind a held guard is kept as a scalar, so the remediation action stays deterministic and never depends on semaphore identity or scheduler timing.

Semaphore Guard Remediation Report

waiters
SemaphoreGuardRemediationReport.cs
Replay: real traced execution (multi-file project)
using System;

class Program
{
    static void Main()
    {
        int waiters = 0;
        int guardLimit = 2;
        int acquired = 1;

        string action;
        if (waiters == 0)
        {
            action = "enter";
        }
        else if (waiters <= guardLimit)
        {
            action = "backoff";
        }
        else
        {
            action = "page";
        }

        Console.WriteLine("waiters=" + waiters + " acquired=" + acquired + " " + action);
    }
}
using System;

class Program
{
    static void Main()
    {
        int waiters = 1;
        int guardLimit = 2;
        int acquired = 1;

        string action;
        if (waiters == 0)
        {
            action = "enter";
        }
        else if (waiters <= guardLimit)
        {
            action = "backoff";
        }
        else
        {
            action = "page";
        }

        Console.WriteLine("waiters=" + waiters + " acquired=" + acquired + " " + action);
    }
}
using System;

class Program
{
    static void Main()
    {
        int waiters = 3;
        int guardLimit = 2;
        int acquired = 1;

        string action;
        if (waiters == 0)
        {
            action = "enter";
        }
        else if (waiters <= guardLimit)
        {
            action = "backoff";
        }
        else
        {
            action = "page";
        }

        Console.WriteLine("waiters=" + waiters + " acquired=" + acquired + " " + action);
    }
}
  1. waiters ← 0, guardLimit ← 2, acquired ← 1

    4{5    static void Main()6    {7        int waiters→ 0 = 0; //@waiters=1, 38        int guardLimit→ 2 = 2;9        int acquired→ 1 = 1;1011        string action;12        if (waiters == 0)
  2. action ← enter

    11string action;12if (waiters0 == 0)13{14    action→ enter = "enter";15}
  3. Console.WriteLine("waiters=" + waiters + " acquired=" + acquired + " "…

    25    Console.WriteLine("waiters=" + waiters0 + " acquired=" + acquired1 + " " + actionenter);26}
    outputwaiters=0 acquired=1 enter
  1. waiters ← 1, guardLimit ← 2, acquired ← 1

    4{5    static void Main()6    {7        int waiters→ 1 = 1;8        int guardLimit→ 2 = 2;9        int acquired→ 1 = 1;1011        string action;12        if (waiters == 0)
  2. action ← backoff

    15}16else if (waiters1 <= guardLimit2)17{18    action→ backoff = "backoff";19}
  3. Console.WriteLine("waiters=" + waiters + " acquired=" + acquired + " "…

    25    Console.WriteLine("waiters=" + waiters1 + " acquired=" + acquired1 + " " + actionbackoff);26}
    outputwaiters=1 acquired=1 backoff
  1. waiters ← 3, guardLimit ← 2, acquired ← 1

    4{5    static void Main()6    {7        int waiters→ 3 = 3;8        int guardLimit→ 2 = 2;9        int acquired→ 1 = 1;1011        string action;12        if (waiters == 0)
  2. action ← page

    19}20else21{22    action→ page = "page";23}
  3. Console.WriteLine("waiters=" + waiters + " acquired=" + acquired + " "…

    25    Console.WriteLine("waiters=" + waiters3 + " acquired=" + acquired1 + " " + actionpage);26}
    outputwaiters=3 acquired=1 page