summaryrefslogtreecommitdiff
path: root/packages/fftw
diff options
context:
space:
mode:
authordaniel <daniel@3ad0048d-3df7-0310-abae-a5850022a9f2>2009-04-04 13:09:29 +0000
committerdaniel <daniel@3ad0048d-3df7-0310-abae-a5850022a9f2>2009-04-04 13:09:29 +0000
commite348da357dc872e8f5d03f65e0f18b72d7d46191 (patch)
treef2ec8db23cba982263b90b941431da1aad525cc3 /packages/fftw
parent4880db2c3574ef6eeff4bcad1680d0bc3a863748 (diff)
downloadfpc-e348da357dc872e8f5d03f65e0f18b72d7d46191.tar.gz
* Apply bugfix patch by Michalis Kamburelis from bug report 13463
git-svn-id: http://svn.freepascal.org/svn/fpc/trunk@12999 3ad0048d-3df7-0310-abae-a5850022a9f2
Diffstat (limited to 'packages/fftw')
-rw-r--r--packages/fftw/src/fftw_s.pas16
1 files changed, 14 insertions, 2 deletions
diff --git a/packages/fftw/src/fftw_s.pas b/packages/fftw/src/fftw_s.pas
index dacc8ed806..79b21c8228 100644
--- a/packages/fftw/src/fftw_s.pas
+++ b/packages/fftw/src/fftw_s.pas
@@ -117,11 +117,19 @@ procedure fftw_freemem(p:pointer);inline;
procedure fftw_getmem(var p:pointer;size:sizeint);
-begin
{$IFDEF align}
- getmem(p,size+16-1);
+var
+ originalptr:pointer;
+begin
+ { We allocate additional "align-1" bytes to be able to align.
+ And we allocate additional "SizeOf(Pointer)" to always have space to store
+ the value of the original pointer. }
+ getmem(originalptr,size + align-1 + SizeOf(Pointer));
+ ptruint(p):=(ptruint(originalptr) + SizeOf(Pointer));
ptruint(p):=(ptruint(p)+align-1) and not (align-1);
+ PPointer(ptruint(p) - SizeOf(Pointer))^:=originalptr;
{$ELSE}
+begin
getmem(p,size);
{$ENDIF}
end;
@@ -129,7 +137,11 @@ end;
procedure fftw_freemem(p:pointer);inline;
begin
+{$IFDEF align}
+ freemem(PPointer(ptruint(p) - SizeOf(Pointer))^);
+{$ELSE}
freemem(p);
+{$ENDIF}
end;
end.