mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-18 18:49:27 +02:00
* Destroying a line reader or write buffer now works within an event
handler of these classes
This commit is contained in:
parent
e55b36f8f9
commit
0675164195
@ -100,7 +100,7 @@ type
|
|||||||
RealBuffer, FBuffer: PChar;
|
RealBuffer, FBuffer: PChar;
|
||||||
FBytesInBuffer: Integer;
|
FBytesInBuffer: Integer;
|
||||||
FOnLine: TLineNotify;
|
FOnLine: TLineNotify;
|
||||||
DoStopAndFree: Boolean;
|
InCallback, DoStopAndFree: Boolean;
|
||||||
|
|
||||||
function Read(var ABuffer; count: Integer): Integer; virtual; abstract;
|
function Read(var ABuffer; count: Integer): Integer; virtual; abstract;
|
||||||
procedure NoData; virtual; abstract;
|
procedure NoData; virtual; abstract;
|
||||||
@ -150,6 +150,7 @@ type
|
|||||||
FBufferSent: Boolean;
|
FBufferSent: Boolean;
|
||||||
FOnBufferEmpty: TNotifyEvent;
|
FOnBufferEmpty: TNotifyEvent;
|
||||||
FOnBufferSent: TNotifyEvent;
|
FOnBufferSent: TNotifyEvent;
|
||||||
|
InCallback: Boolean;
|
||||||
|
|
||||||
function Seek(Offset: LongInt; Origin: Word): LongInt; override;
|
function Seek(Offset: LongInt; Origin: Word): LongInt; override;
|
||||||
function Write(const ABuffer; Count: LongInt): LongInt; override;
|
function Write(const ABuffer; Count: LongInt): LongInt; override;
|
||||||
@ -508,7 +509,8 @@ begin
|
|||||||
begin
|
begin
|
||||||
BytesRead := Read(NewData, SizeOf(NewData));
|
BytesRead := Read(NewData, SizeOf(NewData));
|
||||||
//WriteLn('Linereader: ', BytesRead, ' bytes read');
|
//WriteLn('Linereader: ', BytesRead, ' bytes read');
|
||||||
if BytesRead <= 0 then begin
|
if BytesRead <= 0 then
|
||||||
|
begin
|
||||||
if FirstRun then
|
if FirstRun then
|
||||||
NoData;
|
NoData;
|
||||||
break;
|
break;
|
||||||
@ -546,10 +548,16 @@ begin
|
|||||||
Inc(i);
|
Inc(i);
|
||||||
LastEndOfLine := i + 1;
|
LastEndOfLine := i + 1;
|
||||||
|
|
||||||
if Assigned(FOnLine) then begin
|
if Assigned(FOnLine) then
|
||||||
|
begin
|
||||||
FBuffer := RealBuffer + LastEndOfLine;
|
FBuffer := RealBuffer + LastEndOfLine;
|
||||||
FBytesInBuffer := CurBytesInBuffer - LastEndOfLine;
|
FBytesInBuffer := CurBytesInBuffer - LastEndOfLine;
|
||||||
FOnLine(line);
|
InCallback := True;
|
||||||
|
try
|
||||||
|
FOnLine(line);
|
||||||
|
finally
|
||||||
|
InCallback := False;
|
||||||
|
end;
|
||||||
// Check if <this> has been destroyed by FOnLine:
|
// Check if <this> has been destroyed by FOnLine:
|
||||||
if DoStopAndFree then
|
if DoStopAndFree then
|
||||||
exit;
|
exit;
|
||||||
@ -605,12 +613,16 @@ end;
|
|||||||
|
|
||||||
procedure TAsyncStreamLineReader.StopAndFree;
|
procedure TAsyncStreamLineReader.StopAndFree;
|
||||||
begin
|
begin
|
||||||
if Assigned(NotifyHandle) then
|
if InCallback then
|
||||||
begin
|
begin
|
||||||
EventLoop.ClearDataAvailableNotify(NotifyHandle);
|
if Assigned(NotifyHandle) then
|
||||||
NotifyHandle := nil;
|
begin
|
||||||
end;
|
EventLoop.ClearDataAvailableNotify(NotifyHandle);
|
||||||
DoStopAndFree := True;
|
NotifyHandle := nil;
|
||||||
|
end;
|
||||||
|
DoStopAndFree := True;
|
||||||
|
end else
|
||||||
|
Self.Free;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
function TAsyncStreamLineReader.Read(var ABuffer; count: Integer): Integer;
|
function TAsyncStreamLineReader.Read(var ABuffer; count: Integer): Integer;
|
||||||
@ -637,7 +649,14 @@ begin
|
|||||||
EventLoop.ClearDataAvailableNotify(NotifyHandle);
|
EventLoop.ClearDataAvailableNotify(NotifyHandle);
|
||||||
NotifyHandle := nil;
|
NotifyHandle := nil;
|
||||||
if Assigned(FOnEOF) then
|
if Assigned(FOnEOF) then
|
||||||
FOnEOF(Self);
|
begin
|
||||||
|
InCallback := True;
|
||||||
|
try
|
||||||
|
FOnEOF(Self);
|
||||||
|
finally
|
||||||
|
InCallback := False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -656,7 +675,11 @@ end;
|
|||||||
procedure TWriteBuffer.BufferEmpty;
|
procedure TWriteBuffer.BufferEmpty;
|
||||||
begin
|
begin
|
||||||
if Assigned(FOnBufferEmpty) then
|
if Assigned(FOnBufferEmpty) then
|
||||||
|
begin
|
||||||
|
InCallback := True;
|
||||||
FOnBufferEmpty(Self);
|
FOnBufferEmpty(Self);
|
||||||
|
InCallback := False;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
constructor TWriteBuffer.Create;
|
constructor TWriteBuffer.Create;
|
||||||
@ -778,7 +801,14 @@ begin
|
|||||||
end;
|
end;
|
||||||
FBufferSent := True;
|
FBufferSent := True;
|
||||||
if Assigned(FOnBufferSent) then
|
if Assigned(FOnBufferSent) then
|
||||||
FOnBufferSent(Self);
|
begin
|
||||||
|
InCallback := True;
|
||||||
|
try
|
||||||
|
FOnBufferSent(Self);
|
||||||
|
finally
|
||||||
|
InCallback := False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end else
|
end else
|
||||||
Run;
|
Run;
|
||||||
if DoStopAndFree then
|
if DoStopAndFree then
|
||||||
@ -811,12 +841,16 @@ end;
|
|||||||
|
|
||||||
procedure TAsyncWriteStream.StopAndFree;
|
procedure TAsyncWriteStream.StopAndFree;
|
||||||
begin
|
begin
|
||||||
if Assigned(NotifyHandle) then
|
if InCallback then
|
||||||
begin
|
begin
|
||||||
EventLoop.ClearCanWriteNotify(NotifyHandle);
|
if Assigned(NotifyHandle) then
|
||||||
NotifyHandle := nil;
|
begin
|
||||||
end;
|
EventLoop.ClearCanWriteNotify(NotifyHandle);
|
||||||
DoStopAndFree := True;
|
NotifyHandle := nil;
|
||||||
|
end;
|
||||||
|
DoStopAndFree := True;
|
||||||
|
end else
|
||||||
|
Self.Free;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -825,7 +859,11 @@ end.
|
|||||||
|
|
||||||
{
|
{
|
||||||
$Log$
|
$Log$
|
||||||
Revision 1.5 2003-11-22 11:46:40 sg
|
Revision 1.6 2004-02-02 16:50:44 sg
|
||||||
|
* Destroying a line reader or write buffer now works within an event
|
||||||
|
handler of these classes
|
||||||
|
|
||||||
|
Revision 1.5 2003/11/22 11:46:40 sg
|
||||||
* Removed TAsyncWriteStream.BufferEmpty (not needed anymore)
|
* Removed TAsyncWriteStream.BufferEmpty (not needed anymore)
|
||||||
|
|
||||||
Revision 1.4 2003/08/03 21:18:40 sg
|
Revision 1.4 2003/08/03 21:18:40 sg
|
||||||
|
Loading…
Reference in New Issue
Block a user