IdSchedulerOfFiber.pas 3.3 KB

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