IdScheduler.pas 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195
  1. {
  2. $Project$
  3. $Workfile$
  4. $Revision$
  5. $DateUTC$
  6. $Id$
  7. This file is part of the Indy (Internet Direct) project, and is offered
  8. under the dual-licensing agreement described on the Indy website.
  9. (http://www.indyproject.org/)
  10. Copyright:
  11. (c) 1993-2005, Chad Z. Hower and the Indy Pit Crew. All rights reserved.
  12. }
  13. {
  14. $Log$
  15. }
  16. {
  17. Rev 1.14 4/8/2004 11:55:30 AM BGooijen
  18. Fix for D5
  19. Rev 1.13 2004.03.01 5:12:38 PM czhower
  20. -Bug fix for shutdown of servers when connections still existed (AV)
  21. -Implicit HELP support in CMDserver
  22. -Several command handler bugs
  23. -Additional command handler functionality.
  24. Rev 1.12 2004.01.20 10:03:30 PM czhower
  25. InitComponent
  26. Rev 1.11 2003.10.21 12:18:58 AM czhower
  27. TIdTask support and fiber bug fixes.
  28. Rev 1.10 2003.10.14 11:18:08 PM czhower
  29. Fix for AV on shutdown and other bugs
  30. Rev 1.9 2003.10.11 5:49:24 PM czhower
  31. -VCL fixes for servers
  32. -Chain suport for servers (Super core)
  33. -Scheduler upgrades
  34. -Full yarn support
  35. Rev 1.8 2003.09.19 10:11:16 PM czhower
  36. Next stage of fiber support in servers.
  37. Rev 1.7 2003.09.19 11:54:30 AM czhower
  38. -Completed more features necessary for servers
  39. -Fixed some bugs
  40. Rev 1.6 2003.09.18 4:10:24 PM czhower
  41. Preliminary changes for Yarn support.
  42. Rev 1.5 3/27/2003 5:15:36 PM BGooijen
  43. Moved some code from subclasses here, made MaxThreads published
  44. Rev 1.4 3/13/2003 10:18:36 AM BGooijen
  45. Server side fibers, bug fixes
  46. Rev 1.1 1/23/2003 11:06:04 AM BGooijen
  47. Rev 1.0 1/17/2003 03:41:48 PM JPMugaas
  48. Scheduler base class.
  49. }
  50. unit IdScheduler;
  51. interface
  52. {$i IdCompilerDefines.inc}
  53. uses
  54. {$IFDEF HAS_UNIT_Generics_Collections}
  55. System.Generics.Collections,
  56. {$ELSE}
  57. {$IFDEF VCL_XE3_OR_ABOVE}
  58. System.Classes,
  59. {$ELSE}
  60. Classes,
  61. {$ENDIF}
  62. {$ENDIF}
  63. IdBaseComponent, IdThread, IdTask, IdYarn, IdThreadSafe;
  64. type
  65. {$IFDEF HAS_GENERICS_TThreadList}
  66. TIdYarnThreadList = TIdThreadSafeObjectList<TIdYarn>;
  67. TIdYarnList = TList<TIdYarn>;
  68. {$ELSE}
  69. // TODO: flesh out to match TIdThreadSafeObjectList<TIdYarn> and TList<TIdYarn> for non-Generics compilers
  70. TIdYarnThreadList = TIdThreadSafeObjectList;
  71. TIdYarnList = TList;
  72. {$ENDIF}
  73. TIdScheduler = class(TIdBaseComponent)
  74. protected
  75. FActiveYarns: TIdYarnThreadList;
  76. //
  77. procedure InitComponent; override;
  78. public
  79. destructor Destroy; override;
  80. function AcquireYarn: TIdYarn; virtual; abstract;
  81. procedure Init; virtual;
  82. // ReleaseYarn is to remove a yarn from the list that has already been
  83. // terminated (usually self termination);
  84. procedure ReleaseYarn(AYarn: TIdYarn); virtual;
  85. procedure StartYarn(AYarn: TIdYarn; ATask: TIdTask); virtual; abstract;
  86. // TerminateYarn is to terminate a yarn explicitly and remove it also
  87. procedure TerminateYarn(AYarn: TIdYarn); virtual; abstract;
  88. procedure TerminateAllYarns; virtual;
  89. //
  90. property ActiveYarns: TIdYarnThreadList read FActiveYarns;
  91. end;
  92. implementation
  93. uses
  94. //facilitate inlining only.
  95. {$IFDEF DOTNET}
  96. {$IFDEF USE_INLINE}
  97. System.Threading,
  98. {$ENDIF}
  99. {$ENDIF}
  100. {$IFDEF VCL_2010_OR_ABOVE}
  101. {$IFDEF WINDOWS}
  102. Windows,
  103. {$ENDIF}
  104. {$ENDIF}
  105. {$IFDEF USE_VCL_POSIX}
  106. Posix.SysSelect,
  107. Posix.SysTime,
  108. {$ENDIF}
  109. {$IFDEF HAS_UNIT_Generics_Collections}
  110. {$IFDEF VCL_XE3_OR_ABOVE}
  111. System.Classes,
  112. System.Types,
  113. {$ELSE}
  114. Classes,
  115. {$ENDIF}
  116. {$ELSE}
  117. {$IFDEF VCL_XE3_OR_ABOVE}
  118. System.Types, //here to facilitate inlining
  119. {$ENDIF}
  120. {$ENDIF}
  121. IdGlobal, SysUtils;
  122. { TIdScheduler }
  123. destructor TIdScheduler.Destroy;
  124. begin
  125. FreeAndNil(FActiveYarns);
  126. inherited Destroy;
  127. end;
  128. procedure TIdScheduler.Init;
  129. begin
  130. end;
  131. procedure TIdScheduler.InitComponent;
  132. begin
  133. inherited InitComponent;
  134. FActiveYarns := TIdYarnThreadList.Create;
  135. end;
  136. procedure TIdScheduler.ReleaseYarn(AYarn: TIdYarn);
  137. begin
  138. ActiveYarns.Remove(AYarn);
  139. end;
  140. procedure TIdScheduler.TerminateAllYarns;
  141. var
  142. i: Integer;
  143. LList: TIdYarnList;
  144. begin
  145. Assert(FActiveYarns<>nil);
  146. while True do begin
  147. // Must unlock each time to allow yarns that are terminating to remove themselves from the list
  148. LList := FActiveYarns.LockList;
  149. try
  150. if LList.Count = 0 then begin
  151. Break;
  152. end;
  153. for i := LList.Count - 1 downto 0 do begin
  154. TerminateYarn(
  155. {$IFDEF HAS_GENERICS_TList}LList.Items[i]{$ELSE}TIdYarn(LList.Items[i]){$ENDIF}
  156. );
  157. end;
  158. finally
  159. FActiveYarns.UnlockList;
  160. end;
  161. //TODO: Put terminate timeout check back
  162. IndySleep(500); // Wait a bit before looping to prevent thrashing
  163. end;
  164. end;
  165. end.