monitor.inc 5.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 2024 by the Free Pascal development team
  4. TMonitor support
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. { *********************************************************************
  12. TMonitor
  13. *********************************************************************}
  14. var
  15. _monitormanager : TMonitorManager;
  16. class procedure TMonitor.FreeMonitorData(aData : Pointer);
  17. begin
  18. if Not assigned(aData) then
  19. system.exit;
  20. _monitormanager.DoFreeMonitorData(aData);
  21. end;
  22. class procedure TMonitor.SetDefaultSpinCount(const aSpinCount: LongInt);
  23. begin
  24. _monitormanager.DoSetDefaultSpinCount(aSpinCount);
  25. end;
  26. class function TMonitor.GetDefaultSpinCount : LongInt;
  27. begin
  28. Result:=_monitormanager.DoGetDefaultSpinCount();
  29. end;
  30. class procedure TMonitor.Enter(Const aObject: TObject);
  31. begin
  32. _monitormanager.DoEnter(aObject);
  33. end;
  34. class function TMonitor.Enter(Const aObject: TObject; aTimeout: Cardinal): Boolean;
  35. begin
  36. Result:=_monitormanager.DoEnterTimeout(aObject,aTimeout);
  37. end;
  38. class procedure TMonitor.Exit(Const aObject: TObject);
  39. begin
  40. _monitormanager.DoExit(aObject);
  41. end;
  42. class function TMonitor.TryEnter(Const aObject: TObject): Boolean;
  43. begin
  44. Result:=_monitormanager.DoTryEnter(aObject);
  45. end;
  46. class function TMonitor.Wait(Const aObject: TObject; aTimeout: Cardinal): Boolean;
  47. begin
  48. Result:=_monitormanager.DoWait(aObject,aTimeout);
  49. end;
  50. class function TMonitor.Wait(Const aObject, aLock: TObject; aTimeout: Cardinal): Boolean;
  51. begin
  52. Result:=_monitormanager.DoWaitLock(aObject,aLock,aTimeout);
  53. end;
  54. class procedure TMonitor.Pulse(Const aObject: TObject);
  55. begin
  56. _monitormanager.DoPulse(aObject);
  57. end;
  58. class procedure TMonitor.PulseAll(Const aObject: TObject);
  59. begin
  60. _monitormanager.DoPulseAll(aObject);
  61. end;
  62. { *********************************************************************
  63. Monitor manager
  64. *********************************************************************}
  65. function SysMonitorSetObjectDataProc(const aObject : TObject; aData,aComparand : Pointer) : Pointer;
  66. begin
  67. Result:=aObject.SetMonitorData(aData,aComparand);
  68. end;
  69. function SysMonitorGetObjectDataFunc (const aObject : TObject): Pointer;
  70. begin
  71. Result:=aObject.GetMonitorData;
  72. end;
  73. var
  74. MMsys : TMonitorManager;
  75. function SetMonitorManager (var aNew : TMonitorManager) : TMonitorManager;
  76. begin
  77. Result:=_monitormanager;
  78. aNew.DoSetMonitorObjectData:=@SysMonitorSetObjectDataProc;
  79. aNew.DoGetMonitorObjectData:=@SysMonitorGetObjectDataFunc;
  80. _monitormanager:=aNew;
  81. end;
  82. function GetMonitorManager : TMonitorManager;
  83. begin
  84. Result:=_monitormanager;
  85. end;
  86. procedure DoNoMonitor;
  87. begin
  88. RunError(235);
  89. end;
  90. procedure SysFreeMonitorData(aData : Pointer);
  91. begin
  92. // Do nothing
  93. end;
  94. procedure SysNoMonitor(const aObject : TObject);
  95. begin
  96. DoNoMonitor;
  97. end;
  98. function SysNoMonitorFunc(const aObject : TObject) : Boolean;
  99. begin
  100. Result:=False;
  101. DoNoMonitor;
  102. end;
  103. function SysNoMonitorTimeout(const aObject : TObject; aTimeout : Cardinal) : Boolean;
  104. begin
  105. Result:=False;
  106. DoNoMonitor;
  107. end;
  108. function SysNoMonitorGetDefaultSpinCount : Longint;
  109. begin
  110. Result:=0;
  111. DoNoMonitor;
  112. end;
  113. procedure SysNoMonitorSetDefaultSpinCount(const aValue : Longint);
  114. begin
  115. DoNoMonitor;
  116. end;
  117. function SysNoMonitorDowaitLock(const aObject,aLock : TObject; aTimeout : Cardinal) : Boolean;
  118. begin
  119. Result:=False;
  120. DoNoMonitor;
  121. end;
  122. Procedure InitMonitor;
  123. begin
  124. MMsys.DoEnter:=@SysNoMonitor;
  125. MMsys.DoExit:=@SysNoMonitor;
  126. MMsys.DoPulse:=@SysNoMonitor;
  127. MMsys.DoPulseAll:=@SysNoMonitor;
  128. MMsys.DoEnterTimeout:=@SysNoMonitorTimeout;
  129. MMsys.DoTryEnter:=@SysNoMonitorFunc;
  130. MMsys.DoWait:=@SysNoMonitorTimeout;
  131. MMsys.DoSetDefaultSpinCount:=@SysNoMonitorSetDefaultSpinCount;
  132. MMsys.DoGetDefaultSpinCount:=@SysNoMonitorGetDefaultSpinCount;
  133. MMsys.DoWaitLock:=@SysNoMonitorDowaitLock;
  134. MMsys.DoFreeMonitorData:=@SysFreeMonitorData;
  135. SetMonitorManager(MMsys);
  136. end;
  137. { *********************************************************************
  138. Shortcuts
  139. *********************************************************************}
  140. function MonitorEnter(Const aObject: TObject; aTimeout: Cardinal = INFINITE): Boolean;
  141. begin
  142. if atimeout=Infinite then
  143. TMonitor.Enter(aObject)
  144. else
  145. TMonitor.Enter(aObject,aTimeOut);
  146. end;
  147. function MonitorTryEnter(Const aObject: TObject): Boolean;
  148. begin
  149. TMonitor.TryEnter(aObject);
  150. end;
  151. procedure MonitorExit(Const aObject: TObject);
  152. begin
  153. TMonitor.Exit(aObject);
  154. end;
  155. function MonitorWait(Const aObject: TObject; aTimeout: Cardinal): Boolean;
  156. begin
  157. TMonitor.Wait(aObject,aTimeOut);
  158. end;
  159. function MonitorWait(Const aObject, aLock: TObject; aTimeout: Cardinal): Boolean;
  160. begin
  161. TMonitor.Wait(aObject,aLock,aTimeOut);
  162. end;
  163. procedure MonitorPulse(Const aObject: TObject);
  164. begin
  165. TMonitor.Pulse(aObject);
  166. end;
  167. procedure MonitorPulseAll(Const aObject: TObject);
  168. begin
  169. TMonitor.PulseAll(aObject);
  170. end;