Multithreading — The Delphi Way · © 2000 Martin Harvey
Source example 38
procedure DoSomethingCritical(var Lock: integer);
var
Temp: integer;
begin
Lock := -1;
repeat
Inc(Lock);
Temp := Lock;
if Temp > 0 then
Dec(Lock);
until not (Temp > 0);
Dec(Lock);
end;
procedure AsmDoSomethingCritical(var Lock: integer);
asm
lock mov dword ptr[eax],$FFFFFFFF
@spin:
lock inc dword ptr[eax]
mov edx,[eax]
test edx,edx
jng @skipdec
lock dec dword ptr[eax]
@skipdec:
test edx,edx
jg @spin
lock dec dword ptr[eax]
end;