Record nonblocking guard acquisitions and report whether a later attempt was blocked.

nonblocking acquire A coordination report records nonblocking acquire attempts. A `SemaphoreSlim` created with one permit acts as an exclusive guard, and `Wait(0)` returns true when it takes the permit and false when the permit is already held, so it never blocks. The first acquire takes the only permit, so a later attempt in the same run is reported as blocked and the status line summarizes whether the section stayed idle, guarded, or blocked a later acquire.

Semaphore Guard Coordination Report

holds
SemaphoreGuardCoordinationReport.cs
Replay: real traced execution (multi-file project)
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        int holds = 1;
        var guard = new SemaphoreSlim(1, 1);
        int acquired = 0;
        int blocked = 0;

        for (int i = 0; i < holds; i++)
        {
            if (guard.Wait(0))
            {
                acquired++;
            }
            else
            {
                blocked++;
            }
        }

        string status;
        if (acquired == 0)
        {
            status = "idle";
        }
        else if (blocked > 0)
        {
            status = "blocked";
        }
        else
        {
            status = "guarded";
        }

        Console.WriteLine("holds=" + holds + " acquired=" + acquired + " blocked=" + blocked + " " + status);
    }
}
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        int holds = 0;
        var guard = new SemaphoreSlim(1, 1);
        int acquired = 0;
        int blocked = 0;

        for (int i = 0; i < holds; i++)
        {
            if (guard.Wait(0))
            {
                acquired++;
            }
            else
            {
                blocked++;
            }
        }

        string status;
        if (acquired == 0)
        {
            status = "idle";
        }
        else if (blocked > 0)
        {
            status = "blocked";
        }
        else
        {
            status = "guarded";
        }

        Console.WriteLine("holds=" + holds + " acquired=" + acquired + " blocked=" + blocked + " " + status);
    }
}
using System;
using System.Threading;

class Program
{
    static void Main()
    {
        int holds = 2;
        var guard = new SemaphoreSlim(1, 1);
        int acquired = 0;
        int blocked = 0;

        for (int i = 0; i < holds; i++)
        {
            if (guard.Wait(0))
            {
                acquired++;
            }
            else
            {
                blocked++;
            }
        }

        string status;
        if (acquired == 0)
        {
            status = "idle";
        }
        else if (blocked > 0)
        {
            status = "blocked";
        }
        else
        {
            status = "guarded";
        }

        Console.WriteLine("holds=" + holds + " acquired=" + acquired + " blocked=" + blocked + " " + status);
    }
}
  1. holds ← 1, guard ← System.Threading.SemaphoreSlim, acquired ← 0

    5{6    static void Main()7    {8        int holds→ 1 = 1; //@holds=0, 29        var guard→ System.Threading.SemaphoreSlim = new SemaphoreSlim(1, 1);10        int acquired→ 0 = 0;11        int blocked→ 0 = 0;
  2. for (int i = 0; i < holds; i++)

    13for (int i0 = 0; i < holds1; i++)14{15    if (guard.Wait(0))
  3. acquired ← 1

    14{15    if (guardSystem.Threading.SemaphoreSlim.Wait(0))16    {17        acquired→ 1++;18    }
  4. string status;

    25string status;26if (acquired == 0)
  5. status ← guarded

    33}34else35{36    status→ guarded = "guarded";37}
  6. Console.WriteLine("holds=" + holds + " acquired=" + acquired + " block…

    39    Console.WriteLine("holds=" + holds1 + " acquired=" + acquired1 + " blocked=" + blocked0 + " " + statusguarded);40}
    outputholds=1 acquired=1 blocked=0 guarded
  1. holds ← 0, guard ← System.Threading.SemaphoreSlim, acquired ← 0

    5{6    static void Main()7    {8        int holds→ 0 = 0;9        var guard→ System.Threading.SemaphoreSlim = new SemaphoreSlim(1, 1);10        int acquired→ 0 = 0;11        int blocked→ 0 = 0;1213        for (int i = 0; i < holds; i++)14        {15            if (guard.Wait(0))16            {17                acquired++;18            }19            else20            {21                blocked++;22            }23        }2425        string status;26        if (acquired == 0)
  2. status ← idle

    25string status;26if (acquired0 == 0)27{28    status→ idle = "idle";29}
  3. Console.WriteLine("holds=" + holds + " acquired=" + acquired + " block…

    39    Console.WriteLine("holds=" + holds0 + " acquired=" + acquired0 + " blocked=" + blocked0 + " " + statusidle);40}
    outputholds=0 acquired=0 blocked=0 idle
  1. holds ← 2, guard ← System.Threading.SemaphoreSlim, acquired ← 0

    5{6    static void Main()7    {8        int holds→ 2 = 2;9        var guard→ System.Threading.SemaphoreSlim = new SemaphoreSlim(1, 1);10        int acquired→ 0 = 0;11        int blocked→ 0 = 0;
  2. for (int i = 0; i < holds; i++)

    pass 1 of 2
    13for (int i0 = 0; i < holds2; i++)14{15    if (guard.Wait(0))
  3. acquired ← 1

    14{15    if (guardSystem.Threading.SemaphoreSlim.Wait(0))16    {17        acquired→ 1++;18    }
  4. for (int i = 0; i < holds; i++)

    pass 2 of 2
    13for (int i1 = 0; i < holds2; i++)14{15    if (guard.Wait(0))
  5. blocked ← 1

    18}19else20{21    blocked→ 1++;22}
  6. string status;

    25string status;26if (acquired == 0)
  7. status ← blocked

    29}30else if (blocked1 > 0)31{32    status→ blocked = "blocked";33}
  8. Console.WriteLine("holds=" + holds + " acquired=" + acquired + " block…

    39    Console.WriteLine("holds=" + holds2 + " acquired=" + acquired1 + " blocked=" + blocked1 + " " + statusblocked);40}
    outputholds=2 acquired=1 blocked=1 blocked