136 lines
2.9 KiB
Plaintext
136 lines
2.9 KiB
Plaintext
{
|
|
$Project$
|
|
$Workfile$
|
|
$Revision$
|
|
$DateUTC$
|
|
$Id$
|
|
|
|
This file is part of the Indy (Internet Direct) project, and is offered
|
|
under the dual-licensing agreement described on the Indy website.
|
|
(http://www.indyproject.org/)
|
|
|
|
Copyright:
|
|
(c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
|
|
}
|
|
{
|
|
$Log$
|
|
}
|
|
{
|
|
Rev 1.4 6/11/2004 8:39:56 AM DSiders
|
|
Added "Do not Localize" comments.
|
|
|
|
Rev 1.3 2004-04-23 19:46:52 Mattias
|
|
TTempThread now uses WaitForFibers instead of sleep
|
|
|
|
Rev 1.2 2004.04.22 11:45:18 PM czhower
|
|
Bug fixes
|
|
|
|
Rev 1.1 2004.02.09 9:16:40 PM czhower
|
|
Updated to compile and match lib changes.
|
|
|
|
Rev 1.0 2004.02.03 12:38:54 AM czhower
|
|
Move
|
|
|
|
Rev 1.2 2003.10.21 12:19:22 AM czhower
|
|
TIdTask support and fiber bug fixes.
|
|
|
|
Rev 1.1 2003.10.19 4:38:32 PM czhower
|
|
Updates
|
|
}
|
|
|
|
unit IdFiberWeaverThreaded;
|
|
|
|
interface
|
|
|
|
uses
|
|
Classes,
|
|
IdFiberWeaverInline,
|
|
IdThread, IdSchedulerOfThread, IdFiberWeaver, IdFiber;
|
|
|
|
type
|
|
TTempThread = class(TIdThread)
|
|
protected
|
|
FFiberWeaver: TIdFiberWeaverInline;
|
|
//
|
|
procedure AfterRun; override;
|
|
procedure BeforeRun; override;
|
|
procedure Run; override;
|
|
end;
|
|
|
|
TIdFiberWeaverThreaded = class(TIdFiberWeaver)
|
|
protected
|
|
FThreadScheduler: TIdSchedulerOfThread;
|
|
FTempThread: TTempThread;
|
|
//
|
|
procedure InitComponent; override;
|
|
public
|
|
procedure Add(
|
|
AFiber: TIdFiber
|
|
); override;
|
|
destructor Destroy;
|
|
override;
|
|
published
|
|
property ThreadScheduler: TIdSchedulerOfThread read FThreadScheduler
|
|
write FThreadScheduler;
|
|
end;
|
|
|
|
implementation
|
|
|
|
uses
|
|
SysUtils;
|
|
|
|
{ TTempThread }
|
|
|
|
procedure TTempThread.AfterRun;
|
|
begin
|
|
inherited;
|
|
FreeAndNil(FFiberWeaver);
|
|
end;
|
|
|
|
procedure TTempThread.BeforeRun;
|
|
begin
|
|
inherited;
|
|
//TODO: Make this pluggable at run time? depends where threads come
|
|
//from - merge to scheduler? Base is in IdFiber though....
|
|
FFiberWeaver := TIdFiberWeaverInline.Create(nil);
|
|
FFiberWeaver.FreeFibersOnCompletion := True;
|
|
end;
|
|
|
|
procedure TTempThread.Run;
|
|
begin
|
|
//TODO: Temp hack
|
|
if FFiberWeaver.HasFibers then begin
|
|
FFiberWeaver.ProcessInThisThread;
|
|
end else begin
|
|
//Sleep(50);
|
|
FFiberWeaver.WaitForFibers(50);
|
|
end;
|
|
end;
|
|
|
|
{ TIdFiberWeaverThreaded }
|
|
|
|
procedure TIdFiberWeaverThreaded.Add(AFiber: TIdFiber);
|
|
begin
|
|
FTempThread.FFiberWeaver.Add(AFiber);
|
|
end;
|
|
|
|
destructor TIdFiberWeaverThreaded.Destroy;
|
|
begin
|
|
// is only created at run time
|
|
if FTempThread <> nil then begin
|
|
FTempThread.TerminateAndWaitFor;
|
|
FreeAndNil(FTempThread);
|
|
end;
|
|
inherited;
|
|
end;
|
|
|
|
procedure TIdFiberWeaverThreaded.InitComponent;
|
|
begin
|
|
inherited;
|
|
if not (csDesigning in ComponentState) then begin
|
|
FTempThread := TTempThread.Create(False, True, 'TIdSchedulerOfFiber Temp'); {do not localize}
|
|
end;
|
|
end;
|
|
|
|
end.
|