fixed WaitForHandles

git-svn-id: trunk@4881 -
This commit is contained in:
mattias 2003-12-08 14:27:16 +00:00
parent d40f0332f2
commit a3000e4875
3 changed files with 79 additions and 12 deletions

View File

@ -106,10 +106,9 @@ end;
{------------------------------------------------------------------------------
Function: WaitForHandles
Params: AHandles: A set of handles to wait for (max 32)
Returns: BitArray of handles set, 0 when an error ocoured
Returns: BitArray of handles set, 0 when an error occoured
------------------------------------------------------------------------------}
function WaitForHandles(const AHandles: array of Integer): Integer;
{.$IFDEF Linux}
{$IFDEF UNIX}
var
n, R, Max, Count: Integer;
@ -121,35 +120,54 @@ begin
Count := High(AHandles);
if Count < 0 then Exit;
if Count > 31 then Count := 31;
// zero the whole bit set of handles
{$IFDEF Ver1_0}FD_ZERO{$ELSE}FpFD_ZERO{$ENDIF}(FDS);
// set bits for all waiting handles
for n := 0 to Count do
begin
if Max < AHandles[n] then Max := AHandles[n];
if AHandles[n] <> 0
then {$IFDEF Ver1_0}FD_Set{$ELSE}FpFD_Set{$ENDIF}(AHandles[n], FDS);
if AHandles[n] <> 0 then
{$IFDEF Ver1_0}FD_Set{$ELSE}FpFD_Set{$ENDIF}(AHandles[n], FDS);
end;
if Max=0 then begin
// no valid handle, so no change possible
writeln('WaitForHandles: Error: no handles');
exit;
end;
// wait for all handles
repeat
FDSWait := FDS;
TimeOut := 10;
R := {$IFDEF Ver1_0}Select{$ELSE}FpSelect{$ENDIF}(Max + 1, @FDSWait, nil, nil, TimeOut);
// Select:
// R = -1 on error, 0 on timeout, >0 on success and is number of handles
// FDSWait is changed, and indicates what descriptors have changed
R := {$IFDEF Ver1_0}Select{$ELSE}FpSelect{$ENDIF}(Max + 1, @FDSWait,
nil, nil, TimeOut);
Application.ProcessMessages;
until R <> 0;
// set bits for all changed handles
if R > 0
then begin
for n := 0 to Count do
if (AHandles[n] <> 0)
and ({$IFDEF Ver1_0}FD_ISSET{$ELSE}(FpFD_ISSET{$ENDIF}(AHandles[n], FDSWait){$IFNDEF Ver1_0}=0){$ENDIF})
and {$IFDEF Ver1_0}
FD_ISSET(AHandles[n],FDSWait)
{$ELSE}
(FpFD_ISSET(AHandles[n],FDSWait)=1)
{$ENDIF}
then begin
Result := Result or 1 shl n;
Dec(R);
if R=0 then Break;
end;
end;
end;
{$ELSE}
begin
writeln('ToDo: implement WaitForHandles for this OS');
Result := 0;
{$ENDIF}
end;
@ -310,7 +328,7 @@ begin
WaitSet := WaitForHandles([FDbgProcess.Output.Handle]);
if WaitSet = 0
then begin
WriteLN('[TCmdLineDebugger.Getoutput] Error waiting ');
SmartWriteln('[TCmdLineDebugger.Getoutput] Error waiting ');
SetState(dsError);
Break;
end;
@ -371,6 +389,9 @@ initialization
end.
{ =============================================================================
$Log$
Revision 1.25 2003/12/08 14:27:16 mattias
fixed WaitForHandles
Revision 1.24 2003/10/31 15:14:43 mazen
+ added some paranthesis to avoid operators precedence problems

View File

@ -62,11 +62,48 @@ function GetPart(const ASkipTo, AnEnd: array of String; var ASource: String; con
function ConvertToCString(const AText: String): String;
function DeleteEscapeChars(const AText: String; const AEscapeChar: Char): String;
procedure SmartWriteln(const s: string);
implementation
uses
SysUtils;
{ SmartWriteln: }
var
LastSmartWritelnStr: string;
LastSmartWritelnCount: integer;
LastSmartWritelnTime: double;
procedure SmartWriteln(const s: string);
var
TimeDiff: TTimeStamp;
i: Integer;
begin
if (LastSmartWritelnCount>0) and (s=LastSmartWritelnStr) then begin
TimeDiff:=DateTimeToTimeStamp(Now-LastSmartWritelnTime);
if TimeDiff.Time<1000 then begin
// repeating too fast
inc(LastSmartWritelnCount);
// write every 2nd, 4th, 8th, 16th, ... time
i:=LastSmartWritelnCount;
while (i>0) and ((i and 1)=0) do begin
i:=i shr 1;
if i=1 then begin
writeln('Last message repeated ',LastSmartWritelnCount,' times:',
' "',LastSmartWritelnStr,'"');
break;
end;
end;
exit;
end;
end;
LastSmartWritelnTime:=Now;
LastSmartWritelnStr:=s;
LastSmartWritelnCount:=1;
writeln(LastSmartWritelnStr);
end;
function GetLine(var ABuffer: String): String;
var
idx: Integer;
@ -278,9 +315,15 @@ begin
end;
end;
initialization
LastSmartWritelnCount:=0;
end.
{ =============================================================================
$Log$
Revision 1.10 2003/12/08 14:27:16 mattias
fixed WaitForHandles
Revision 1.9 2003/08/15 14:28:48 mattias
clean up win32 ifdefs

View File

@ -40,9 +40,9 @@ interface
{$ASSERTIONS ON}
uses classes, forms, buttons, StdCtrls, controls, menus, ExtCtrls, CListBox,
ComCtrls, SysUtils, GraphType, Graphics, Dialogs, Inifiles, Spin, clipbrd,
LCLIntf, registry, lresources;
uses Classes, Forms, Buttons, StdCtrls, Controls, Menus, ExtCtrls, CListBox,
ComCtrls, SysUtils, GraphType, Graphics, Dialogs, Inifiles, Spin, ClipBrd,
LCLIntf, LResources;
type
TForm1 = class(TForm)
@ -2585,6 +2585,9 @@ END.
{
$Log$
Revision 1.15 2003/12/08 14:27:16 mattias
fixed WaitForHandles
Revision 1.14 2003/11/25 09:15:55 mattias
fixed testall