Browse Source

* fixed sparc alignment issues with popen/pclose

git-svn-id: trunk@4346 -
Jonas Maebe 19 years ago
parent
commit
7522d8d967
2 changed files with 25 additions and 12 deletions
  1. 11 5
      rtl/solaris/unxfunc.inc
  2. 14 7
      rtl/unix/unix.pp

+ 11 - 5
rtl/solaris/unxfunc.inc

@@ -17,25 +17,31 @@ Function PClose(Var F:file) : cint;
 var
 var
   pl : ^cint;
   pl : ^cint;
   res : cint;
   res : cint;
+  pid: cint;
 
 
 begin
 begin
   fpclose(filerec(F).Handle);
   fpclose(filerec(F).Handle);
 { closed our side, Now wait for the other - this appears to be needed ?? }
 { closed our side, Now wait for the other - this appears to be needed ?? }
   pl:=@(filerec(f).userdata[2]);
   pl:=@(filerec(f).userdata[2]);
-  fpwaitpid(pl^,@res,0);
+  { avoid alignment error on sparc }
+  move(pl^,pid,sizeof(pid));
+  fpwaitpid(pid,@res,0);
   pclose:=res shr 8;
   pclose:=res shr 8;
 end;
 end;
 
 
 Function PClose(Var F:text) :cint;
 Function PClose(Var F:text) :cint;
 var
 var
-  pl  : ^longint;
-  res : longint;
+  pl  : ^cint;
+  res : cint;
+  pid: cint;
 
 
 begin
 begin
   fpclose(Textrec(F).Handle);
   fpclose(Textrec(F).Handle);
 { closed our side, Now wait for the other - this appears to be needed ?? }
 { closed our side, Now wait for the other - this appears to be needed ?? }
   pl:=@(textrec(f).userdata[2]);
   pl:=@(textrec(f).userdata[2]);
-  fpwaitpid(pl^,@res,0);
+  { avoid alignment error on sparc }
+  move(pl^,pid,sizeof(pid));
+  fpwaitpid(pid,@res,0);
   pclose:=res shr 8;
   pclose:=res shr 8;
 end;
 end;
 {$ENDIF}
 {$ENDIF}
@@ -110,4 +116,4 @@ Function fpFlock (fd,mode : longint) : cint;
 		if (result=-1) and (errno=EACCES)
 		if (result=-1) and (errno=EACCES)
 			errno:=EWOULDBLOCK;
 			errno:=EWOULDBLOCK;
 }
 }
-  end;
+  end;

+ 14 - 7
rtl/unix/unix.pp

@@ -859,7 +859,8 @@ begin
      textrec(f).bufptr:=@textrec(f).buffer;
      textrec(f).bufptr:=@textrec(f).buffer;
    {Save the process ID - needed when closing }
    {Save the process ID - needed when closing }
      pl:=@(textrec(f).userdata[2]);
      pl:=@(textrec(f).userdata[2]);
-     pl^:=pid;
+     { avoid alignment error on sparc }
+     move(pid,pl^,sizeof(pid));
      textrec(f).closefunc:=@PCloseText;
      textrec(f).closefunc:=@PCloseText;
    end;
    end;
  POpen:=0;
  POpen:=0;
@@ -972,7 +973,8 @@ begin
       end;
       end;
    {Save the process ID - needed when closing }
    {Save the process ID - needed when closing }
      pl:=@(filerec(f).userdata[2]);
      pl:=@(filerec(f).userdata[2]);
-     pl^:=pid;
+     { avoid alignment error on sparc }
+     move(pid,pl^,sizeof(pid));
    end;
    end;
  POpen:=0;
  POpen:=0;
 end;
 end;
@@ -1035,11 +1037,13 @@ begin
      close(pipi);
      close(pipi);
      {Save the process ID - needed when closing }
      {Save the process ID - needed when closing }
      pl:=@(textrec(StreamIn).userdata[2]);
      pl:=@(textrec(StreamIn).userdata[2]);
-     pl^:=pid;
+     { avoid alignment error on sparc }
+     move(pid,pl^,sizeof(pid));
      textrec(StreamIn).closefunc:=@PCloseText;
      textrec(StreamIn).closefunc:=@PCloseText;
      {Save the process ID - needed when closing }
      {Save the process ID - needed when closing }
      pl:=@(textrec(StreamOut).userdata[2]);
      pl:=@(textrec(StreamOut).userdata[2]);
-     pl^:=pid;
+     { avoid alignment error on sparc }
+     move(pid,pl^,sizeof(pid));
      textrec(StreamOut).closefunc:=@PCloseText;
      textrec(StreamOut).closefunc:=@PCloseText;
      AssignStream:=Pid;
      AssignStream:=Pid;
    end;
    end;
@@ -1125,15 +1129,18 @@ begin
     Close(PipeIn);
     Close(PipeIn);
     // Save the process ID - needed when closing
     // Save the process ID - needed when closing
     pl := @(TextRec(StreamIn).userdata[2]);
     pl := @(TextRec(StreamIn).userdata[2]);
-    pl^ := pid;
+    { avoid alignment error on sparc }
+    move(pid,pl^,sizeof(pid));
     TextRec(StreamIn).closefunc := @PCloseText;
     TextRec(StreamIn).closefunc := @PCloseText;
     // Save the process ID - needed when closing
     // Save the process ID - needed when closing
     pl := @(TextRec(StreamOut).userdata[2]);
     pl := @(TextRec(StreamOut).userdata[2]);
-    pl^ := pid;
+    { avoid alignment error on sparc }
+    move(pid,pl^,sizeof(pid));
     TextRec(StreamOut).closefunc := @PCloseText;
     TextRec(StreamOut).closefunc := @PCloseText;
     // Save the process ID - needed when closing
     // Save the process ID - needed when closing
     pl := @(TextRec(StreamErr).userdata[2]);
     pl := @(TextRec(StreamErr).userdata[2]);
-    pl^ := pid;
+    { avoid alignment error on sparc }
+    move(pid,pl^,sizeof(pid));
     TextRec(StreamErr).closefunc := @PCloseText;
     TextRec(StreamErr).closefunc := @PCloseText;
     AssignStream := pid;
     AssignStream := pid;
   end;
   end;