From 0c65d53f45cf4842075533be32aff9ff3a0dbcf4 Mon Sep 17 00:00:00 2001 From: florian Date: Sat, 7 Feb 2009 16:09:05 +0000 Subject: [PATCH] + added register keyword to Interlocked* definitions as suggested by Jonas, resolves #12255 git-svn-id: trunk@12698 - --- .gitattributes | 1 + rtl/win/wininc/redef.inc | 12 ++++++------ tests/webtbs/tw12255.pp | 21 +++++++++++++++++++++ 3 files changed, 28 insertions(+), 6 deletions(-) create mode 100644 tests/webtbs/tw12255.pp diff --git a/.gitattributes b/.gitattributes index c84f7c7c0e..ad59a34b59 100644 --- a/.gitattributes +++ b/.gitattributes @@ -8719,6 +8719,7 @@ tests/webtbs/tw12233.pp svneol=native#text/plain tests/webtbs/tw12237.pp svneol=native#text/plain tests/webtbs/tw12242.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/tw1229.pp svneol=native#text/plain tests/webtbs/tw12318.pp svneol=native#text/plain diff --git a/rtl/win/wininc/redef.inc b/rtl/win/wininc/redef.inc index d0f1e374f5..366f222e64 100644 --- a/rtl/win/wininc/redef.inc +++ b/rtl/win/wininc/redef.inc @@ -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 HwndMSWheel(var puiMsh_MsgMouseWheel, puiMsh_Msg3DSupport,puiMsh_MsgScrollLines: UINT; 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 PropertySheetA(p:TPROPSHEETHEADER):longint; external 'comctl32' name 'PropertySheetA'; // windows because of Delphi compat. {$calling default} -function InterLockedIncrement (var Target: longint) : longint; external name 'FPC_INTERLOCKEDINCREMENT'; -function InterLockedDecrement (var Target: longint) : longint; external name 'FPC_INTERLOCKEDDECREMENT'; -function InterLockedExchange (var Target: longint;Source : longint) : longint; external name 'FPC_INTERLOCKEDEXCHANGE'; -function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; external name 'FPC_INTERLOCKEDEXCHANGEADD'; -function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE'; +function InterLockedIncrement (var Target: longint) : longint; register; external name 'FPC_INTERLOCKEDINCREMENT'; +function InterLockedDecrement (var Target: longint) : longint; register; external name 'FPC_INTERLOCKEDDECREMENT'; +function InterLockedExchange (var Target: longint;Source : longint) : longint; register; external name 'FPC_INTERLOCKEDEXCHANGE'; +function InterLockedExchangeAdd (var Target: longint;Source : longint) : longint; register; external name 'FPC_INTERLOCKEDEXCHANGEADD'; +function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comperand: longint): longint; register; external name 'FPC_INTERLOCKEDCOMPAREEXCHANGE'; {$calling stdcall} {$endif read_interface} diff --git a/tests/webtbs/tw12255.pp b/tests/webtbs/tw12255.pp new file mode 100644 index 0000000000..92ab921c0d --- /dev/null +++ b/tests/webtbs/tw12255.pp @@ -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.