2
0
Эх сурвалжийг харах

Merged revision(s) 41400, 41459 from trunk:
* android: Fixed stdio redirection for threads.
........
* android: Mask SSE exceptions for i386 too.
........

git-svn-id: branches/fixes_3_2@41613 -

yury 6 жил өмнө
parent
commit
5ed8ce23a2

+ 4 - 4
rtl/android/cwstring.pp

@@ -67,19 +67,19 @@ threadvar
 
 function MaskExceptions: dword;
 begin
-{$ifdef cpux86_64}
+{$if defined(cpux86_64) or defined(cpui386)}
   Result:=GetMXCSR;
   SetMXCSR(Result or %0000000010000000 {MM_MaskInvalidOp} or %0001000000000000 {MM_MaskPrecision});
 {$else}
   Result:=0;
-{$endif cpux86_64}
+{$endif}
 end;
 
 procedure UnmaskExceptions(oldmask: dword);
 begin
-{$ifdef cpux86_64}
+{$if defined(cpux86_64) or defined(cpui386)}
   SetMXCSR(oldmask);
-{$endif cpux86_64}
+{$endif}
 end;
 
 function OpenConverter(const name: ansistring): PUConverter;

+ 20 - 8
rtl/android/sysandroid.inc

@@ -215,9 +215,10 @@ end;
 
 const
   IOBufferLength = 512;
-var
+threadvar
   IOBuf : array[0..IOBufferLength] of char;
   IOLen : SizeInt;
+var
   IORedirected: boolean;
 
 procedure OutputIOBuffer(Var F: TextRec);
@@ -235,12 +236,16 @@ end;
 procedure IOWrite(Var F: TextRec);
 var
   i, len : SizeInt;
+  pIOBuf: PAnsiChar;
+  pIOLen: ^SizeInt;
 Begin
+  pIOBuf:=@IOBuf;
+  pIOLen:=@IOLen;
   while F.BufPos>0 do
     begin
       begin
-        if F.BufPos + IOLen > IOBufferLength then
-          len:=IOBufferLength - IOLen
+        if F.BufPos + pIOLen^ > IOBufferLength then
+          len:=IOBufferLength - pIOLen^
         else
           len:=F.BufPos;
         i:=0;
@@ -248,7 +253,7 @@ Begin
           begin
             if F.bufptr^[i] in [#10, #13] then
               begin
-                IOBuf[IOLen]:=#0;
+                pIOBuf[pIOLen^]:=#0;
                 OutputIOBuffer(F);
                 Inc(i);
                 if (i < len) and (F.bufptr^[i - 1] = #13) and (F.bufptr^[i] = #10) then
@@ -256,14 +261,14 @@ Begin
               end
             else
               begin
-                IOBuf[IOLen]:=F.bufptr^[i];
-                Inc(IOLen);
+                pIOBuf[pIOLen^]:=F.bufptr^[i];
+                Inc(pIOLen^);
                 Inc(i);
               end;
           end;
-        IOBuf[IOLen]:=#0;
+        pIOBuf[pIOLen^]:=#0;
       end;
-      if IOLen = IOBufferLength then
+      if pIOLen^ = IOBufferLength then
         OutputIOBuffer(F);
       Dec(F.BufPos, len);
     end;
@@ -311,6 +316,13 @@ begin
   DefaultLogTag[len + 1]:=#0;
 end;
 
+procedure InitStdIOAndroid;
+begin
+  if not IORedirected then exit;
+  IORedirected:=False;
+  RedirectOutputToSysLog;
+end;
+
 // ************* System init
 
 procedure InitAndroid;

+ 3 - 0
rtl/linux/system.pp

@@ -376,6 +376,9 @@ begin
   OpenStdIO(ErrOutput,fmOutput,StdErrorHandle);
   OpenStdIO(StdOut,fmOutput,StdOutputHandle);
   OpenStdIO(StdErr,fmOutput,StdErrorHandle);
+{$ifdef android}
+  InitStdIOAndroid;
+{$endif android}
 end;
 
 Procedure RestoreOldSignalHandlers;