فهرست منبع

+ InterlockedCompareExchangePointer() alias for InterlockedCompareExchange(pointer)
(mantis #29964)

git-svn-id: trunk@34599 -

Jonas Maebe 9 سال پیش
والد
کامیت
868370d727
3فایلهای تغییر یافته به همراه39 افزوده شده و 0 حذف شده
  1. 1 0
      .gitattributes
  2. 2 0
      rtl/inc/systemh.inc
  3. 36 0
      tests/webtbs/tw29964.pp

+ 1 - 0
.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

+ 2 - 0
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';

+ 36 - 0
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.