IdSchedulerOfFiber.pas 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155
  1. { $HDR$}
  2. {**********************************************************************}
  3. { Unit archived using Team Coherence }
  4. { Team Coherence is Copyright 2002 by Quality Software Components }
  5. { }
  6. { For further information / comments, visit our WEB site at }
  7. { http://www.TeamCoherence.com }
  8. {**********************************************************************}
  9. {}
  10. { $Log: 56076: IdSchedulerOfFiber.pas
  11. {
  12. Rev 1.2 6/11/2004 8:40:06 AM DSiders
  13. Added "Do not Localize" comments.
  14. }
  15. {
  16. { Rev 1.1 2004.02.09 9:16:48 PM czhower
  17. { Updated to compile and match lib changes.
  18. }
  19. {
  20. { Rev 1.0 2004.02.03 12:38:58 AM czhower
  21. { Move
  22. }
  23. {
  24. { Rev 1.9 2003.10.24 1:00:06 PM czhower
  25. { Name change
  26. }
  27. {
  28. { Rev 1.8 2003.10.21 12:19:20 AM czhower
  29. { TIdTask support and fiber bug fixes.
  30. }
  31. {
  32. { Rev 1.7 2003.10.19 4:38:34 PM czhower
  33. { Updates
  34. }
  35. {
  36. { Rev 1.6 2003.10.19 2:50:40 PM czhower
  37. { Fiber cleanup
  38. }
  39. {
  40. { Rev 1.5 2003.10.19 1:04:28 PM czhower
  41. { Updates
  42. }
  43. {
  44. { Rev 1.4 2003.10.14 11:17:06 PM czhower
  45. { Updates to match core changes.
  46. }
  47. {
  48. { Rev 1.3 2003.10.11 5:43:48 PM czhower
  49. { Chained servers now functional.
  50. }
  51. {
  52. { Rev 1.2 2003.09.19 10:09:42 PM czhower
  53. { Next stage of fiber support in servers.
  54. }
  55. unit IdSchedulerOfFiber;
  56. interface
  57. uses
  58. Classes,
  59. IdFiberWeaver, IdTask, IdFiber, IdScheduler, IdYarn;
  60. type
  61. TIdSchedulerOfFiber = class;
  62. TIdYarnOfFiber = class(TIdYarn)
  63. protected
  64. FFiber: TIdFiberWithTask;
  65. FScheduler: TIdScheduler;
  66. public
  67. constructor Create(
  68. AScheduler: TIdScheduler;
  69. AFiber: TIdFiberWithTask
  70. ); reintroduce; virtual;
  71. destructor Destroy;
  72. override;
  73. //
  74. property Fiber: TIdFiberWithTask read FFiber;
  75. end;
  76. TIdSchedulerOfFiber = class(TIdScheduler)
  77. protected
  78. FFiberWeaver: TIdFiberWeaver;
  79. public
  80. function AcquireYarn
  81. : TIdYarn;
  82. override;
  83. procedure StartYarn(
  84. AYarn: TIdYarn;
  85. ATask: TIdTask
  86. ); override;
  87. procedure TerminateYarn(
  88. AYarn: TIdYarn
  89. ); override;
  90. published
  91. //TODO: Need to add notification for this prop
  92. //TODO: Dont allow setting while active
  93. property FiberWeaver: TIdFiberWeaver read FFiberWeaver write FFiberWeaver;
  94. end;
  95. implementation
  96. uses
  97. IdGlobal,
  98. SysUtils;
  99. { TIdSchedulerOfFiber }
  100. function TIdSchedulerOfFiber.AcquireYarn: TIdYarn;
  101. var
  102. LFiber: TIdFiberWithTask;
  103. begin
  104. LFiber := TIdFiberWithTask.Create(nil, nil, Format('%s User', [Name])); {do not localize}
  105. Result := TIdYarnOfFiber.Create(Self, LFiber);
  106. ActiveYarns.Add(Result);
  107. end;
  108. procedure TIdSchedulerOfFiber.StartYarn(
  109. AYarn: TIdYarn;
  110. ATask: TIdTask
  111. );
  112. begin
  113. inherited;
  114. TIdYarnOfFiber(AYarn).Fiber.Task := ATask;
  115. // Last - Put it in the queue to be scheduled
  116. FiberWeaver.Add(TIdYarnOfFiber(AYarn).Fiber);
  117. end;
  118. procedure TIdSchedulerOfFiber.TerminateYarn(AYarn: TIdYarn);
  119. begin
  120. // Fibers dont "run", so we dont terminate them
  121. FreeAndNil(AYarn);
  122. end;
  123. { TIdYarnOfFiber }
  124. constructor TIdYarnOfFiber.Create(
  125. AScheduler: TIdScheduler;
  126. AFiber: TIdFiberWithTask
  127. );
  128. begin
  129. inherited Create;
  130. FScheduler := AScheduler;
  131. FFiber := AFiber;
  132. AFiber.Yarn := Self;
  133. end;
  134. destructor TIdYarnOfFiber.Destroy;
  135. begin
  136. FScheduler.ReleaseYarn(Self);
  137. inherited;
  138. end;
  139. end.