Amiga/m68k: software atomic operations implementation for multithreading

git-svn-id: trunk@30901 -
This commit is contained in:
Károly Balogh 2015-05-24 21:31:13 +00:00
parent e02e742997
commit 89aadb22c2
2 changed files with 67 additions and 0 deletions

1
.gitattributes vendored
View File

@ -8046,6 +8046,7 @@ rtl/amiga/doslibd.inc svneol=native#text/plain
rtl/amiga/m68k/doslibf.inc svneol=native#text/plain
rtl/amiga/m68k/execd.inc svneol=native#text/plain
rtl/amiga/m68k/execf.inc svneol=native#text/plain
rtl/amiga/m68k/m68kamiga.inc svneol=native#text/plain
rtl/amiga/m68k/prt0.as svneol=native#text/plain
rtl/amiga/m68k/utild1.inc svneol=native#text/plain
rtl/amiga/m68k/utild2.inc svneol=native#text/plain

View File

@ -0,0 +1,66 @@
{
This file is part of the Free Pascal run time library.
Copyright (c) 2015 by Karoly Balogh,
member of the Free Pascal development team.
m68k/Amiga atomic operations implementation
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{ The Amiga hardware doesn't support the m68k CPU's atomic operations
like TAS, CAS, CAS2 and so on. Therefore we must "emulate" them from
software. The easiest way is the Forbid()/Permit() OS call pair around
the ops themselves. It of course won't be hardware-atomic, but should
be safe for multithreading. (KB) }
function InterLockedDecrement (var Target: longint) : longint;
begin
Forbid();
Dec(Target);
Result := Target;
Permit();
end;
function InterLockedIncrement (var Target: longint) : longint;
begin
Forbid()
Inc(Target);
Result := Target;
Permit();
end;
function InterLockedExchange (var Target: longint;Source : longint) : longint;
begin
Forbid();
Result := Target;
Target := Source;
Permit();
end;
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint;
begin
Forbid();
Result := Target;
Target := Target + Source;
Permit();
end;
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint;
begin
Forbid();
Result := Target;
if Target = Comperand then
Target := NewValue;
Permit();
end;