From 868370d7276457ea5389681d90069778b1c71859 Mon Sep 17 00:00:00 2001 From: Jonas Maebe Date: Sun, 2 Oct 2016 12:57:07 +0000 Subject: [PATCH] + InterlockedCompareExchangePointer() alias for InterlockedCompareExchange(pointer) (mantis #29964) git-svn-id: trunk@34599 - --- .gitattributes | 1 + rtl/inc/systemh.inc | 2 ++ tests/webtbs/tw29964.pp | 36 ++++++++++++++++++++++++++++++++++++ 3 files changed, 39 insertions(+) create mode 100644 tests/webtbs/tw29964.pp diff --git a/.gitattributes b/.gitattributes index 398055cfc3..f8a3d41948 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15195,6 +15195,7 @@ tests/webtbs/tw29923.pp svneol=native#text/plain tests/webtbs/tw29930.pp svneol=native#text/plain tests/webtbs/tw29933.pp svneol=native#text/plain tests/webtbs/tw29958.pp svneol=native#text/pascal +tests/webtbs/tw29964.pp svneol=native#text/plain tests/webtbs/tw2998.pp svneol=native#text/plain tests/webtbs/tw2999.pp svneol=native#text/plain tests/webtbs/tw29992.pp svneol=native#text/plain diff --git a/rtl/inc/systemh.inc b/rtl/inc/systemh.inc index e224e8195f..fb2011fc96 100644 --- a/rtl/inc/systemh.inc +++ b/rtl/inc/systemh.inc @@ -1396,12 +1396,14 @@ function InterLockedDecrement (var Target: Pointer) : Pointer; external name 'FP function InterLockedExchange (var Target: Pointer;Source : Pointer) : Pointer; external name 'FPC_INTERLOCKEDEXCHANGE64'; function InterLockedExchangeAdd (var Target: Pointer;Source : Pointer) : Pointer; external name 'FPC_INTERLOCKEDEXCHANGEADD64'; function InterlockedCompareExchange(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE64'; +function InterlockedCompareExchangePointer(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE64'; {$else cpu64} function InterLockedIncrement (var Target: Pointer) : Pointer; external name 'FPC_INTERLOCKEDINCREMENT'; function InterLockedDecrement (var Target: Pointer) : Pointer; external name 'FPC_INTERLOCKEDDECREMENT'; function InterLockedExchange (var Target: Pointer;Source : Pointer) : Pointer; external name 'FPC_INTERLOCKEDEXCHANGE'; function InterLockedExchangeAdd (var Target: Pointer;Source : Pointer) : Pointer; external name 'FPC_INTERLOCKEDEXCHANGEADD'; function InterlockedCompareExchange(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE'; +function InterlockedCompareExchangePointer(var Target: Pointer; NewValue: Pointer; Comperand: Pointer): Pointer; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE'; {$endif cpu64} { unsigned overloads } function InterLockedIncrement (var Target: cardinal) : cardinal; external name 'FPC_INTERLOCKEDINCREMENT'; diff --git a/tests/webtbs/tw29964.pp b/tests/webtbs/tw29964.pp new file mode 100644 index 0000000000..f4e4690595 --- /dev/null +++ b/tests/webtbs/tw29964.pp @@ -0,0 +1,36 @@ +{$packrecords 1} +{$r-} + +var + r: record + i: int64; + p: pointer; + w: smallint; + end; + +var + i: longint; + b: byte; + orgp,oldp,newp: pointer; +begin + r.i:=-1; + r.w:=-1; + b:=$12; + ptruint(r.p):=b; + for i:=2 to sizeof(r.p) do + begin + b:=b*3; + ptruint(r.p):=ptruint(r.p) shl 8 or b; + end; + orgp:=r.p; + newp:=pointer(not ptruint(orgp)); + oldp:=InterlockedCompareExchangePointer(r.p,newp,r.p); + if oldp<>orgp then + halt(1); + if r.p<>newp then + halt(2); + if r.i<>-1 then + halt(3); + if r.w<>-1 then + halt(4); +end.