Browse Source

* Apply bugfix patch by Michalis Kamburelis from bug report 13463

git-svn-id: trunk@12999 -
daniel 16 years ago
parent
commit
1b8902e341
1 changed files with 14 additions and 2 deletions
  1. 14 2
      packages/fftw/src/fftw_s.pas

+ 14 - 2
packages/fftw/src/fftw_s.pas

@@ -117,11 +117,19 @@ procedure fftw_freemem(p:pointer);inline;
 
 
 procedure fftw_getmem(var p:pointer;size:sizeint);
 procedure fftw_getmem(var p:pointer;size:sizeint);
 
 
-begin
 {$IFDEF align}
 {$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);
   ptruint(p):=(ptruint(p)+align-1) and not (align-1);
+  PPointer(ptruint(p) - SizeOf(Pointer))^:=originalptr;
 {$ELSE}
 {$ELSE}
+begin
   getmem(p,size);
   getmem(p,size);
 {$ENDIF}
 {$ENDIF}
 end;
 end;
@@ -129,7 +137,11 @@ end;
 procedure fftw_freemem(p:pointer);inline;
 procedure fftw_freemem(p:pointer);inline;
 
 
 begin
 begin
+{$IFDEF align}
+  freemem(PPointer(ptruint(p) - SizeOf(Pointer))^);
+{$ELSE}
   freemem(p);
   freemem(p);
+{$ENDIF}
 end;
 end;
 
 
 end.
 end.