if C<0 then begin
signal(mutex); (* A *)
wait(delay); (* B *)
end
else
signal(mutex);
El wait(delay) en Wait() debería estar antes del signal(mutex). Se supone que si P1 llama a Wait() antes que P2, entonces P1 debería ser habilitado antes que P2 para entrar a la sección crítica. Imaginate la situación siguiente:
C ← 1
P0 llama Wait(S)
P1 llama Wait(S) y ejecuta hasta A
P2 llama Wait(S) y llega hasta B, duerme
P1 continúa y llega a B, duerme
P0 llama Signal(S) y despierta a P2 en lugar de despertar a P1
Le estuve dando vueltas y no veo posposición indefinida ni deadlocks. Pero igual no debería pasar esto tampoco. Se supone que el semáforo no asegura un orden para procesos que llegan al mismo tiempo, pero sí para procesos que llegan en un orden bien definido. De hecho el mutex en Wait() queda parcialmente inútil con el código como está (c podría llegar a valer cualquier valor negativo, cuando es claro que la intención del que hizo el código era que no pudiera bajar de -1. En este escenario es un detalle menor, en otros casos podría ser grave).
Saludos