mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-13 09:39:09 +02:00
+ added register keyword to Interlocked* definitions as suggested by Jonas, resolves #12255
git-svn-id: trunk@12698 -
This commit is contained in:
parent
c4310a6f08
commit
0c65d53f45
1
.gitattributes
vendored
1
.gitattributes
vendored
@ -8719,6 +8719,7 @@ tests/webtbs/tw12233.pp svneol=native#text/plain
|
|||||||
tests/webtbs/tw12237.pp svneol=native#text/plain
|
tests/webtbs/tw12237.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw12242.pp svneol=native#text/plain
|
tests/webtbs/tw12242.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw12249.pp svneol=native#text/plain
|
tests/webtbs/tw12249.pp svneol=native#text/plain
|
||||||
|
tests/webtbs/tw12255.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw1228.pp svneol=native#text/plain
|
tests/webtbs/tw1228.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw1229.pp svneol=native#text/plain
|
tests/webtbs/tw1229.pp svneol=native#text/plain
|
||||||
tests/webtbs/tw12318.pp svneol=native#text/plain
|
tests/webtbs/tw12318.pp svneol=native#text/plain
|
||||||
|
@ -1004,18 +1004,18 @@ function SetKeyboardState(var KeyState:TKeyboardState):WINBOOL; external 'user32
|
|||||||
function GetWindowThreadProcessId(hWnd:HWND;var lpdwProcessId:DWORD):DWORD; external 'user32' name 'GetWindowThreadProcessId';
|
function GetWindowThreadProcessId(hWnd:HWND;var lpdwProcessId:DWORD):DWORD; external 'user32' name 'GetWindowThreadProcessId';
|
||||||
function HwndMSWheel(var puiMsh_MsgMouseWheel, puiMsh_Msg3DSupport,puiMsh_MsgScrollLines: UINT;
|
function HwndMSWheel(var puiMsh_MsgMouseWheel, puiMsh_Msg3DSupport,puiMsh_MsgScrollLines: UINT;
|
||||||
var pf3DSupport: BOOL; var piScrollLines: Integer): HWND;
|
var pf3DSupport: BOOL; var piScrollLines: Integer): HWND;
|
||||||
function CreateWaitableTimer(lpTimerAttributes :LPSECURITY_ATTRIBUTES; bManualReset:BOOl;lpTimerName:LPCTSTR):THandle;external 'kernel32' name 'CreateWaitableTimerA';
|
function CreateWaitableTimer(lpTimerAttributes :LPSECURITY_ATTRIBUTES; bManualReset:BOOl;lpTimerName:LPCTSTR):THandle;external 'kernel32' name 'CreateWaitableTimerA';
|
||||||
function OpenWaitableTimer(dwDesiredAccess:DWORD;bInheritHandle:BOOL;lpTimerName:LPCTSTR):THandle;external 'kernel32' name 'OpenWaitableTimerA';
|
function OpenWaitableTimer(dwDesiredAccess:DWORD;bInheritHandle:BOOL;lpTimerName:LPCTSTR):THandle;external 'kernel32' name 'OpenWaitableTimerA';
|
||||||
//function PropertySheetA(p:TPROPSHEETHEADER):longint; external 'comctl32' name 'PropertySheetA';
|
//function PropertySheetA(p:TPROPSHEETHEADER):longint; external 'comctl32' name 'PropertySheetA';
|
||||||
|
|
||||||
// windows because of Delphi compat.
|
// windows because of Delphi compat.
|
||||||
|
|
||||||
{$calling default}
|
{$calling default}
|
||||||
function InterLockedIncrement (var Target: longint) : longint; external name 'FPC_INTERLOCKEDINCREMENT';
|
function InterLockedIncrement (var Target: longint) : longint; register; external name 'FPC_INTERLOCKEDINCREMENT';
|
||||||
function InterLockedDecrement (var Target: longint) : longint; external name 'FPC_INTERLOCKEDDECREMENT';
|
function InterLockedDecrement (var Target: longint) : longint; register; external name 'FPC_INTERLOCKEDDECREMENT';
|
||||||
function InterLockedExchange (var Target: longint;Source : longint) : longint; external name 'FPC_INTERLOCKEDEXCHANGE';
|
function InterLockedExchange (var Target: longint;Source : longint) : longint; register; external name 'FPC_INTERLOCKEDEXCHANGE';
|
||||||
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; external name 'FPC_INTERLOCKEDEXCHANGEADD';
|
function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; register; external name 'FPC_INTERLOCKEDEXCHANGEADD';
|
||||||
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
|
function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; register; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE';
|
||||||
{$calling stdcall}
|
{$calling stdcall}
|
||||||
|
|
||||||
{$endif read_interface}
|
{$endif read_interface}
|
||||||
|
21
tests/webtbs/tw12255.pp
Normal file
21
tests/webtbs/tw12255.pp
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
{ %target=win32 }
|
||||||
|
{$mode objfpc}
|
||||||
|
uses sysutils
|
||||||
|
, windows
|
||||||
|
;
|
||||||
|
var
|
||||||
|
SharedInt : PInteger;
|
||||||
|
target : integer;
|
||||||
|
savetarget : integer;
|
||||||
|
|
||||||
|
begin
|
||||||
|
target := 0;
|
||||||
|
savetarget := system.InterlockedCompareExchange(Target, 1, 0);
|
||||||
|
Writeln(format('%d = InterlockedCompareExchange(Target= %d , 1, 0)',[savetarget, target]));
|
||||||
|
SharedInt := AllocMem(SizeOf(Integer));
|
||||||
|
SharedInt^ := 0;
|
||||||
|
// here is runtime exception rised - access to invalid memory
|
||||||
|
savetarget := windows.InterlockedCompareExchange(SharedInt^, 1, 0);
|
||||||
|
Writeln(format('%d = InterlockedCompareExchange(SharedInt^= %d , 1, 0)',[savetarget, SharedInt^]));
|
||||||
|
FreeMem(SharedInt);
|
||||||
|
end.
|
Loading…
Reference in New Issue
Block a user