thread.inc 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361
  1. {
  2. $Id$
  3. This file is part of the Free Pascal Run time library.
  4. Copyright (c) 2000 by the Free Pascal development team
  5. OS independent thread functions/overloads
  6. See the File COPYING.FPC, included in this distribution,
  7. for details about the copyright.
  8. This program is distributed in the hope that it will be useful,
  9. but WITHOUT ANY WARRANTY; without even the implied warranty of
  10. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  11. **********************************************************************}
  12. Var
  13. CurrentTM : TThreadManager;
  14. {*****************************************************************************
  15. Threadvar initialization
  16. *****************************************************************************}
  17. procedure InitThread(stklen:cardinal);
  18. begin
  19. SysResetFPU;
  20. { ExceptAddrStack and ExceptObjectStack are threadvars }
  21. { so every thread has its on exception handling capabilities }
  22. SysInitExceptions;
  23. { Open all stdio fds again }
  24. SysInitStdio;
  25. InOutRes:=0;
  26. // ErrNo:=0;
  27. { Stack checking }
  28. StackLength:=stklen;
  29. StackBottom:=Sptr - StackLength;
  30. ThreadID := CurrentTM.GetCurrentThreadID();
  31. end;
  32. {*****************************************************************************
  33. Overloaded functions
  34. *****************************************************************************}
  35. {$ifndef CPU64}
  36. {$ifndef unix}
  37. function BeginThread(sa : Pointer;stacksize : dword;
  38. ThreadFunction : tthreadfunc;p : pointer;creationFlags : dword;
  39. var ThreadId : Longint) : DWord;
  40. begin
  41. BeginThread:=BeginThread(nil,StackSize,ThreadFunction,p,creationFlags,THandle(THreadId));
  42. end;
  43. {$endif unix}
  44. {$endif CPU64}
  45. function BeginThread(ThreadFunction : tthreadfunc) : DWord;
  46. var
  47. dummy : THandle;
  48. begin
  49. BeginThread:=BeginThread(nil,DefaultStackSize,ThreadFunction,nil,0,dummy);
  50. end;
  51. function BeginThread(ThreadFunction : tthreadfunc;p : pointer) : DWord;
  52. var
  53. dummy : THandle;
  54. begin
  55. BeginThread:=BeginThread(nil,DefaultStackSize,ThreadFunction,p,0,dummy);
  56. end;
  57. function BeginThread(ThreadFunction : tthreadfunc;p : pointer;var ThreadId : THandle) : DWord;
  58. begin
  59. BeginThread:=BeginThread(nil,DefaultStackSize,ThreadFunction,p,0,ThreadId);
  60. end;
  61. {$ifndef CPU64}
  62. {$ifndef unix}
  63. function BeginThread(ThreadFunction : tthreadfunc;p : pointer;var ThreadId : Longint) : DWord;
  64. begin
  65. BeginThread:=BeginThread(nil,DefaultStackSize,ThreadFunction,p,0,THandle(ThreadId));
  66. end;
  67. {$endif unix}
  68. {$endif CPU64}
  69. procedure EndThread;
  70. begin
  71. EndThread(0);
  72. end;
  73. function BeginThread(sa : Pointer;stacksize : dword; ThreadFunction : tthreadfunc;p : pointer;creationFlags : dword; var ThreadId : THandle) : DWord;
  74. begin
  75. Result:=CurrentTM.BeginThread(sa,stacksize,threadfunction,P,creationflags,ThreadID);
  76. end;
  77. procedure EndThread(ExitCode : DWord);
  78. begin
  79. CurrentTM.EndThread(ExitCode);
  80. end;
  81. function SuspendThread (threadHandle : dword) : dword;
  82. begin
  83. Result:=CurrentTM.SuspendThread(ThreadHandle);
  84. end;
  85. function ResumeThread (threadHandle : dword) : dword;
  86. begin
  87. Result:=CurrentTM.ResumeThread(ThreadHandle);
  88. end;
  89. procedure ThreadSwitch;
  90. begin
  91. CurrentTM.ThreadSwitch;
  92. end;
  93. function KillThread (threadHandle : dword) : dword;
  94. begin
  95. Result:=CurrentTM.KillThread(ThreadHandle);
  96. end;
  97. function WaitForThreadTerminate (threadHandle : dword; TimeoutMs : longint) : dword;
  98. begin
  99. Result:=CurrentTM.WaitForThreadTerminate(ThreadHandle,TimeOutMS);
  100. end;
  101. function ThreadSetPriority (threadHandle : dword; Prio: longint): boolean;
  102. begin
  103. Result:=CurrentTM.ThreadSetPriority(ThreadHandle,Prio);
  104. end;
  105. function ThreadGetPriority (threadHandle : dword): Integer;
  106. begin
  107. Result:=CurrentTM.ThreadGetPriority(ThreadHandle);
  108. end;
  109. function GetCurrentThreadId : dword;
  110. begin
  111. Result:=CurrentTM.GetCurrentThreadID();
  112. end;
  113. procedure InitCriticalSection(var cs : TRTLCriticalSection);
  114. begin
  115. CurrentTM.InitCriticalSection(cs);
  116. end;
  117. procedure DoneCriticalsection(var cs : TRTLCriticalSection);
  118. begin
  119. CurrentTM.DoneCriticalSection(cs);
  120. end;
  121. procedure EnterCriticalsection(var cs : TRTLCriticalSection);
  122. begin
  123. CurrentTM.EnterCriticalSection(cs);
  124. end;
  125. procedure LeaveCriticalsection(var cs : TRTLCriticalSection);
  126. begin
  127. CurrentTM.LeaveCriticalSection(cs);
  128. end;
  129. Function GetThreadManager(Var TM : TThreadManager) : Boolean;
  130. begin
  131. TM:=CurrentTM;
  132. Result:=True;
  133. end;
  134. Function SetThreadManager(Const NewTM : TThreadManager; Var OldTM : TThreadManager) : Boolean;
  135. begin
  136. GetThreadManager(OldTM);
  137. Result:=SetThreadManager(NewTM);
  138. end;
  139. Function SetThreadManager(Const NewTM : TThreadManager) : Boolean;
  140. begin
  141. Result:=True;
  142. If Assigned(CurrentTM.DoneManager) then
  143. Result:=CurrentTM.DoneManager();
  144. If Result then
  145. begin
  146. CurrentTM:=NewTM;
  147. If Assigned(CurrentTM.InitManager) then
  148. Result:=CurrentTM.InitManager();
  149. end;
  150. end;
  151. { ---------------------------------------------------------------------
  152. ThreadManager which gives run-time error. Use if no thread support.
  153. ---------------------------------------------------------------------}
  154. Resourcestring
  155. SNoThreads = 'This binary has no thread support compiled in.';
  156. SRecompileWithThreads = 'Recompile the application with a thread-driver in the program uses clause.';
  157. Procedure NoThreadError;
  158. begin
  159. If IsConsole then
  160. begin
  161. Writeln(StdErr,SNoThreads);
  162. Writeln(StdErr,SRecompileWithThreads);
  163. end;
  164. RunError(232)
  165. end;
  166. function NoBeginThread(sa : Pointer;stacksize : dword;
  167. ThreadFunction : tthreadfunc;p : pointer;
  168. creationFlags : dword; var ThreadId : THandle) : DWord;
  169. begin
  170. NoThreadError;
  171. end;
  172. procedure NoEndThread(ExitCode : DWord);
  173. begin
  174. NoThreadError;
  175. end;
  176. function NoThreadHandler (threadHandle : dword) : dword;
  177. begin
  178. NoThreadError;
  179. end;
  180. procedure NoThreadSwitch; {give time to other threads}
  181. begin
  182. NoThreadError;
  183. end;
  184. function NoWaitForThreadTerminate (threadHandle : dword; TimeoutMs : longint) : dword; {0=no timeout}
  185. begin
  186. NoThreadError;
  187. end;
  188. function NoThreadSetPriority (threadHandle : dword; Prio: longint): boolean; {-15..+15, 0=normal}
  189. begin
  190. NoThreadError;
  191. end;
  192. function NoThreadGetPriority (threadHandle : dword): Integer;
  193. begin
  194. NoThreadError;
  195. end;
  196. function NoGetCurrentThreadId : dword;
  197. begin
  198. NoThreadError;
  199. end;
  200. procedure NoCriticalSection(var CS);
  201. begin
  202. NoThreadError;
  203. end;
  204. procedure NoInitThreadvar(var offset : dword;size : dword);
  205. begin
  206. NoThreadError;
  207. end;
  208. function NoRelocateThreadvar(offset : dword) : pointer;
  209. begin
  210. NoThreadError;
  211. end;
  212. procedure NoAllocateThreadVars;
  213. begin
  214. NoThreadError;
  215. end;
  216. procedure NoReleaseThreadVars;
  217. begin
  218. NoThreadError;
  219. end;
  220. Var
  221. NoThreadManager : TThreadManager;
  222. Procedure SetNoThreadManager;
  223. begin
  224. With NoThreadManager do
  225. begin
  226. InitManager :=Nil;
  227. DoneManager :=Nil;
  228. BeginThread :=@NoBeginThread;
  229. EndThread :=@NoEndThread;
  230. SuspendThread :=@NoThreadHandler;
  231. ResumeThread :=@NoThreadHandler;
  232. KillThread :=@NoThreadHandler;
  233. ThreadSwitch :=@NoThreadSwitch;
  234. WaitForThreadTerminate :=@NoWaitForThreadTerminate;
  235. ThreadSetPriority :=@NoThreadSetPriority;
  236. ThreadGetPriority :=@NoThreadGetPriority;
  237. GetCurrentThreadId :=@NoGetCurrentThreadId;
  238. InitCriticalSection :=@NoCriticalSection;
  239. DoneCriticalSection :=@NoCriticalSection;
  240. EnterCriticalSection :=@NoCriticalSection;
  241. LeaveCriticalSection :=@NoCriticalSection;
  242. InitThreadVar :=@NoInitThreadVar;
  243. RelocateThreadVar :=@NoRelocateThreadVar;
  244. AllocateThreadVars :=@NoAllocateThreadVars;
  245. ReleaseThreadVars :=@NoReleaseThreadVars;
  246. end;
  247. SetThreadManager(NoThreadManager);
  248. end;
  249. {
  250. $Log$
  251. Revision 1.10 2004-02-22 23:22:49 florian
  252. * fixed BeginThread on unix
  253. Revision 1.9 2004/02/22 16:48:39 florian
  254. * several 64 bit issues fixed
  255. Revision 1.8 2004/01/21 20:11:06 peter
  256. * fixed compile for unix
  257. Revision 1.7 2004/01/20 23:13:53 hajny
  258. * ExecuteProcess fixes, ProcessID and ThreadID added
  259. Revision 1.6 2003/11/29 17:33:09 michael
  260. + Removed dummy variable from SetNothreadManager
  261. Revision 1.5 2003/11/29 17:29:32 michael
  262. + Added overloaded version of SetThreadManager without old parameter
  263. Revision 1.4 2003/11/26 20:10:59 michael
  264. + New threadmanager implementation
  265. Revision 1.3 2002/11/14 12:40:06 jonas
  266. * the BeginThread() variant that allowed you to specify the stacksize
  267. still passed DefaultStackSize to the OS-specific routines
  268. Revision 1.2 2002/10/16 19:04:27 michael
  269. + More system-independent thread routines
  270. Revision 1.1 2002/10/14 19:39:17 peter
  271. * threads unit added for thread support
  272. }