Team Fortress 2 Source Code as on 22/4/2020
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

890 lines
27 KiB

  1. /*
  2. File: Threads.h
  3. Contains: Thread Manager Interfaces.
  4. Version: QuickTime 7.3
  5. Copyright: (c) 2007 (c) 1991-2001 by Apple Computer, Inc., all rights reserved.
  6. Bugs?: For bug reports, consult the following page on
  7. the World Wide Web:
  8. http://developer.apple.com/bugreporter/
  9. */
  10. #ifndef __THREADS__
  11. #define __THREADS__
  12. #ifndef __MACTYPES__
  13. #include <MacTypes.h>
  14. #endif
  15. #ifndef __MIXEDMODE__
  16. #include <MixedMode.h>
  17. #endif
  18. #ifndef __MACERRORS__
  19. #include <MacErrors.h>
  20. #endif
  21. #if PRAGMA_ONCE
  22. #pragma once
  23. #endif
  24. #ifdef __cplusplus
  25. extern "C" {
  26. #endif
  27. #if PRAGMA_IMPORT
  28. #pragma import on
  29. #endif
  30. #if PRAGMA_STRUCT_ALIGN
  31. #pragma options align=mac68k
  32. #elif PRAGMA_STRUCT_PACKPUSH
  33. #pragma pack(push, 2)
  34. #elif PRAGMA_STRUCT_PACK
  35. #pragma pack(2)
  36. #endif
  37. /* Thread states*/
  38. typedef UInt16 ThreadState;
  39. enum {
  40. kReadyThreadState = 0,
  41. kStoppedThreadState = 1,
  42. kRunningThreadState = 2
  43. };
  44. /* Error codes have been moved to Errors.(pah)*/
  45. /* Thread environment characteristics*/
  46. typedef void * ThreadTaskRef;
  47. /* Thread characteristics*/
  48. typedef UInt32 ThreadStyle;
  49. enum {
  50. kCooperativeThread = 1L << 0,
  51. kPreemptiveThread = 1L << 1
  52. };
  53. /* Thread identifiers*/
  54. typedef UInt32 ThreadID;
  55. enum {
  56. kNoThreadID = 0,
  57. kCurrentThreadID = 1,
  58. kApplicationThreadID = 2
  59. };
  60. /* Options when creating a thread*/
  61. typedef UInt32 ThreadOptions;
  62. enum {
  63. kNewSuspend = (1 << 0),
  64. kUsePremadeThread = (1 << 1),
  65. kCreateIfNeeded = (1 << 2),
  66. kFPUNotNeeded = (1 << 3),
  67. kExactMatchThread = (1 << 4)
  68. };
  69. /* Information supplied to the custom scheduler*/
  70. struct SchedulerInfoRec {
  71. UInt32 InfoRecSize;
  72. ThreadID CurrentThreadID;
  73. ThreadID SuggestedThreadID;
  74. ThreadID InterruptedCoopThreadID;
  75. };
  76. typedef struct SchedulerInfoRec SchedulerInfoRec;
  77. typedef SchedulerInfoRec * SchedulerInfoRecPtr;
  78. /*
  79. The following ProcPtrs cannot be interchanged with UniversalProcPtrs because
  80. of differences between 680x0 and PowerPC runtime architectures with regard to
  81. the implementation of the Thread Manager.
  82. */
  83. typedef void * voidPtr;
  84. /* Prototype for thread's entry (main) routine*/
  85. typedef CALLBACK_API( voidPtr , ThreadEntryProcPtr )(void * threadParam);
  86. /* Prototype for custom thread scheduler routine*/
  87. typedef CALLBACK_API( ThreadID , ThreadSchedulerProcPtr )(SchedulerInfoRecPtr schedulerInfo);
  88. /* Prototype for custom thread switcher routine*/
  89. typedef CALLBACK_API( void , ThreadSwitchProcPtr )(ThreadID threadBeingSwitched, void *switchProcParam);
  90. /* Prototype for thread termination notification routine*/
  91. typedef CALLBACK_API( void , ThreadTerminationProcPtr )(ThreadID threadTerminated, void *terminationProcParam);
  92. /* Prototype for debugger NewThread notification*/
  93. typedef CALLBACK_API( void , DebuggerNewThreadProcPtr )(ThreadID threadCreated);
  94. /* Prototype for debugger DisposeThread notification*/
  95. typedef CALLBACK_API( void , DebuggerDisposeThreadProcPtr )(ThreadID threadDeleted);
  96. /* Prototype for debugger schedule notification*/
  97. typedef CALLBACK_API( ThreadID , DebuggerThreadSchedulerProcPtr )(SchedulerInfoRecPtr schedulerInfo);
  98. typedef TVECTOR_UPP_TYPE(ThreadEntryProcPtr) ThreadEntryUPP;
  99. typedef TVECTOR_UPP_TYPE(ThreadSchedulerProcPtr) ThreadSchedulerUPP;
  100. typedef TVECTOR_UPP_TYPE(ThreadSwitchProcPtr) ThreadSwitchUPP;
  101. typedef TVECTOR_UPP_TYPE(ThreadTerminationProcPtr) ThreadTerminationUPP;
  102. typedef TVECTOR_UPP_TYPE(DebuggerNewThreadProcPtr) DebuggerNewThreadUPP;
  103. typedef TVECTOR_UPP_TYPE(DebuggerDisposeThreadProcPtr) DebuggerDisposeThreadUPP;
  104. typedef TVECTOR_UPP_TYPE(DebuggerThreadSchedulerProcPtr) DebuggerThreadSchedulerUPP;
  105. /*
  106. * NewThreadEntryUPP()
  107. *
  108. * Availability:
  109. * Non-Carbon CFM: available as macro/inline
  110. * CarbonLib: in CarbonLib 1.0 and later
  111. * Mac OS X: in version 10.0 and later
  112. */
  113. EXTERN_API_C( ThreadEntryUPP )
  114. NewThreadEntryUPP(ThreadEntryProcPtr userRoutine);
  115. #if !OPAQUE_UPP_TYPES
  116. enum { uppThreadEntryProcInfo = 0x000000F0 }; /* pascal 4_bytes Func(4_bytes) */
  117. #ifdef __cplusplus
  118. inline DEFINE_API_C(ThreadEntryUPP) NewThreadEntryUPP(ThreadEntryProcPtr userRoutine) { return userRoutine; }
  119. #else
  120. #define NewThreadEntryUPP(userRoutine) (userRoutine)
  121. #endif
  122. #endif
  123. /*
  124. * NewThreadSchedulerUPP()
  125. *
  126. * Availability:
  127. * Non-Carbon CFM: available as macro/inline
  128. * CarbonLib: in CarbonLib 1.0 and later
  129. * Mac OS X: in version 10.0 and later
  130. */
  131. EXTERN_API_C( ThreadSchedulerUPP )
  132. NewThreadSchedulerUPP(ThreadSchedulerProcPtr userRoutine);
  133. #if !OPAQUE_UPP_TYPES
  134. enum { uppThreadSchedulerProcInfo = 0x000000F0 }; /* pascal 4_bytes Func(4_bytes) */
  135. #ifdef __cplusplus
  136. inline DEFINE_API_C(ThreadSchedulerUPP) NewThreadSchedulerUPP(ThreadSchedulerProcPtr userRoutine) { return userRoutine; }
  137. #else
  138. #define NewThreadSchedulerUPP(userRoutine) (userRoutine)
  139. #endif
  140. #endif
  141. /*
  142. * NewThreadSwitchUPP()
  143. *
  144. * Availability:
  145. * Non-Carbon CFM: available as macro/inline
  146. * CarbonLib: in CarbonLib 1.0 and later
  147. * Mac OS X: in version 10.0 and later
  148. */
  149. EXTERN_API_C( ThreadSwitchUPP )
  150. NewThreadSwitchUPP(ThreadSwitchProcPtr userRoutine);
  151. #if !OPAQUE_UPP_TYPES
  152. enum { uppThreadSwitchProcInfo = 0x000003C0 }; /* pascal no_return_value Func(4_bytes, 4_bytes) */
  153. #ifdef __cplusplus
  154. inline DEFINE_API_C(ThreadSwitchUPP) NewThreadSwitchUPP(ThreadSwitchProcPtr userRoutine) { return userRoutine; }
  155. #else
  156. #define NewThreadSwitchUPP(userRoutine) (userRoutine)
  157. #endif
  158. #endif
  159. /*
  160. * NewThreadTerminationUPP()
  161. *
  162. * Availability:
  163. * Non-Carbon CFM: available as macro/inline
  164. * CarbonLib: in CarbonLib 1.0 and later
  165. * Mac OS X: in version 10.0 and later
  166. */
  167. EXTERN_API_C( ThreadTerminationUPP )
  168. NewThreadTerminationUPP(ThreadTerminationProcPtr userRoutine);
  169. #if !OPAQUE_UPP_TYPES
  170. enum { uppThreadTerminationProcInfo = 0x000003C0 }; /* pascal no_return_value Func(4_bytes, 4_bytes) */
  171. #ifdef __cplusplus
  172. inline DEFINE_API_C(ThreadTerminationUPP) NewThreadTerminationUPP(ThreadTerminationProcPtr userRoutine) { return userRoutine; }
  173. #else
  174. #define NewThreadTerminationUPP(userRoutine) (userRoutine)
  175. #endif
  176. #endif
  177. /*
  178. * NewDebuggerNewThreadUPP()
  179. *
  180. * Availability:
  181. * Non-Carbon CFM: available as macro/inline
  182. * CarbonLib: in CarbonLib 1.0 and later
  183. * Mac OS X: in version 10.0 and later
  184. */
  185. EXTERN_API_C( DebuggerNewThreadUPP )
  186. NewDebuggerNewThreadUPP(DebuggerNewThreadProcPtr userRoutine);
  187. #if !OPAQUE_UPP_TYPES
  188. enum { uppDebuggerNewThreadProcInfo = 0x000000C0 }; /* pascal no_return_value Func(4_bytes) */
  189. #ifdef __cplusplus
  190. inline DEFINE_API_C(DebuggerNewThreadUPP) NewDebuggerNewThreadUPP(DebuggerNewThreadProcPtr userRoutine) { return userRoutine; }
  191. #else
  192. #define NewDebuggerNewThreadUPP(userRoutine) (userRoutine)
  193. #endif
  194. #endif
  195. /*
  196. * NewDebuggerDisposeThreadUPP()
  197. *
  198. * Availability:
  199. * Non-Carbon CFM: available as macro/inline
  200. * CarbonLib: in CarbonLib 1.0 and later
  201. * Mac OS X: in version 10.0 and later
  202. */
  203. EXTERN_API_C( DebuggerDisposeThreadUPP )
  204. NewDebuggerDisposeThreadUPP(DebuggerDisposeThreadProcPtr userRoutine);
  205. #if !OPAQUE_UPP_TYPES
  206. enum { uppDebuggerDisposeThreadProcInfo = 0x000000C0 }; /* pascal no_return_value Func(4_bytes) */
  207. #ifdef __cplusplus
  208. inline DEFINE_API_C(DebuggerDisposeThreadUPP) NewDebuggerDisposeThreadUPP(DebuggerDisposeThreadProcPtr userRoutine) { return userRoutine; }
  209. #else
  210. #define NewDebuggerDisposeThreadUPP(userRoutine) (userRoutine)
  211. #endif
  212. #endif
  213. /*
  214. * NewDebuggerThreadSchedulerUPP()
  215. *
  216. * Availability:
  217. * Non-Carbon CFM: available as macro/inline
  218. * CarbonLib: in CarbonLib 1.0 and later
  219. * Mac OS X: in version 10.0 and later
  220. */
  221. EXTERN_API_C( DebuggerThreadSchedulerUPP )
  222. NewDebuggerThreadSchedulerUPP(DebuggerThreadSchedulerProcPtr userRoutine);
  223. #if !OPAQUE_UPP_TYPES
  224. enum { uppDebuggerThreadSchedulerProcInfo = 0x000000F0 }; /* pascal 4_bytes Func(4_bytes) */
  225. #ifdef __cplusplus
  226. inline DEFINE_API_C(DebuggerThreadSchedulerUPP) NewDebuggerThreadSchedulerUPP(DebuggerThreadSchedulerProcPtr userRoutine) { return userRoutine; }
  227. #else
  228. #define NewDebuggerThreadSchedulerUPP(userRoutine) (userRoutine)
  229. #endif
  230. #endif
  231. /*
  232. * DisposeThreadEntryUPP()
  233. *
  234. * Availability:
  235. * Non-Carbon CFM: available as macro/inline
  236. * CarbonLib: in CarbonLib 1.0 and later
  237. * Mac OS X: in version 10.0 and later
  238. */
  239. EXTERN_API_C( void )
  240. DisposeThreadEntryUPP(ThreadEntryUPP userUPP);
  241. #if !OPAQUE_UPP_TYPES
  242. #ifdef __cplusplus
  243. inline DEFINE_API_C(void) DisposeThreadEntryUPP(ThreadEntryUPP) {}
  244. #else
  245. #define DisposeThreadEntryUPP(userUPP)
  246. #endif
  247. #endif
  248. /*
  249. * DisposeThreadSchedulerUPP()
  250. *
  251. * Availability:
  252. * Non-Carbon CFM: available as macro/inline
  253. * CarbonLib: in CarbonLib 1.0 and later
  254. * Mac OS X: in version 10.0 and later
  255. */
  256. EXTERN_API_C( void )
  257. DisposeThreadSchedulerUPP(ThreadSchedulerUPP userUPP);
  258. #if !OPAQUE_UPP_TYPES
  259. #ifdef __cplusplus
  260. inline DEFINE_API_C(void) DisposeThreadSchedulerUPP(ThreadSchedulerUPP) {}
  261. #else
  262. #define DisposeThreadSchedulerUPP(userUPP)
  263. #endif
  264. #endif
  265. /*
  266. * DisposeThreadSwitchUPP()
  267. *
  268. * Availability:
  269. * Non-Carbon CFM: available as macro/inline
  270. * CarbonLib: in CarbonLib 1.0 and later
  271. * Mac OS X: in version 10.0 and later
  272. */
  273. EXTERN_API_C( void )
  274. DisposeThreadSwitchUPP(ThreadSwitchUPP userUPP);
  275. #if !OPAQUE_UPP_TYPES
  276. #ifdef __cplusplus
  277. inline DEFINE_API_C(void) DisposeThreadSwitchUPP(ThreadSwitchUPP) {}
  278. #else
  279. #define DisposeThreadSwitchUPP(userUPP)
  280. #endif
  281. #endif
  282. /*
  283. * DisposeThreadTerminationUPP()
  284. *
  285. * Availability:
  286. * Non-Carbon CFM: available as macro/inline
  287. * CarbonLib: in CarbonLib 1.0 and later
  288. * Mac OS X: in version 10.0 and later
  289. */
  290. EXTERN_API_C( void )
  291. DisposeThreadTerminationUPP(ThreadTerminationUPP userUPP);
  292. #if !OPAQUE_UPP_TYPES
  293. #ifdef __cplusplus
  294. inline DEFINE_API_C(void) DisposeThreadTerminationUPP(ThreadTerminationUPP) {}
  295. #else
  296. #define DisposeThreadTerminationUPP(userUPP)
  297. #endif
  298. #endif
  299. /*
  300. * DisposeDebuggerNewThreadUPP()
  301. *
  302. * Availability:
  303. * Non-Carbon CFM: available as macro/inline
  304. * CarbonLib: in CarbonLib 1.0 and later
  305. * Mac OS X: in version 10.0 and later
  306. */
  307. EXTERN_API_C( void )
  308. DisposeDebuggerNewThreadUPP(DebuggerNewThreadUPP userUPP);
  309. #if !OPAQUE_UPP_TYPES
  310. #ifdef __cplusplus
  311. inline DEFINE_API_C(void) DisposeDebuggerNewThreadUPP(DebuggerNewThreadUPP) {}
  312. #else
  313. #define DisposeDebuggerNewThreadUPP(userUPP)
  314. #endif
  315. #endif
  316. /*
  317. * DisposeDebuggerDisposeThreadUPP()
  318. *
  319. * Availability:
  320. * Non-Carbon CFM: available as macro/inline
  321. * CarbonLib: in CarbonLib 1.0 and later
  322. * Mac OS X: in version 10.0 and later
  323. */
  324. EXTERN_API_C( void )
  325. DisposeDebuggerDisposeThreadUPP(DebuggerDisposeThreadUPP userUPP);
  326. #if !OPAQUE_UPP_TYPES
  327. #ifdef __cplusplus
  328. inline DEFINE_API_C(void) DisposeDebuggerDisposeThreadUPP(DebuggerDisposeThreadUPP) {}
  329. #else
  330. #define DisposeDebuggerDisposeThreadUPP(userUPP)
  331. #endif
  332. #endif
  333. /*
  334. * DisposeDebuggerThreadSchedulerUPP()
  335. *
  336. * Availability:
  337. * Non-Carbon CFM: available as macro/inline
  338. * CarbonLib: in CarbonLib 1.0 and later
  339. * Mac OS X: in version 10.0 and later
  340. */
  341. EXTERN_API_C( void )
  342. DisposeDebuggerThreadSchedulerUPP(DebuggerThreadSchedulerUPP userUPP);
  343. #if !OPAQUE_UPP_TYPES
  344. #ifdef __cplusplus
  345. inline DEFINE_API_C(void) DisposeDebuggerThreadSchedulerUPP(DebuggerThreadSchedulerUPP) {}
  346. #else
  347. #define DisposeDebuggerThreadSchedulerUPP(userUPP)
  348. #endif
  349. #endif
  350. /*
  351. * InvokeThreadEntryUPP()
  352. *
  353. * Availability:
  354. * Non-Carbon CFM: available as macro/inline
  355. * CarbonLib: in CarbonLib 1.0 and later
  356. * Mac OS X: in version 10.0 and later
  357. */
  358. EXTERN_API_C( voidPtr )
  359. InvokeThreadEntryUPP(
  360. void * threadParam,
  361. ThreadEntryUPP userUPP);
  362. #if !OPAQUE_UPP_TYPES
  363. #ifdef __cplusplus
  364. inline DEFINE_API_C(voidPtr) InvokeThreadEntryUPP(void * threadParam, ThreadEntryUPP userUPP) { return (*userUPP)(threadParam); }
  365. #else
  366. #define InvokeThreadEntryUPP(threadParam, userUPP) (*userUPP)(threadParam)
  367. #endif
  368. #endif
  369. /*
  370. * InvokeThreadSchedulerUPP()
  371. *
  372. * Availability:
  373. * Non-Carbon CFM: available as macro/inline
  374. * CarbonLib: in CarbonLib 1.0 and later
  375. * Mac OS X: in version 10.0 and later
  376. */
  377. EXTERN_API_C( ThreadID )
  378. InvokeThreadSchedulerUPP(
  379. SchedulerInfoRecPtr schedulerInfo,
  380. ThreadSchedulerUPP userUPP);
  381. #if !OPAQUE_UPP_TYPES
  382. #ifdef __cplusplus
  383. inline DEFINE_API_C(ThreadID) InvokeThreadSchedulerUPP(SchedulerInfoRecPtr schedulerInfo, ThreadSchedulerUPP userUPP) { return (*userUPP)(schedulerInfo); }
  384. #else
  385. #define InvokeThreadSchedulerUPP(schedulerInfo, userUPP) (*userUPP)(schedulerInfo)
  386. #endif
  387. #endif
  388. /*
  389. * InvokeThreadSwitchUPP()
  390. *
  391. * Availability:
  392. * Non-Carbon CFM: available as macro/inline
  393. * CarbonLib: in CarbonLib 1.0 and later
  394. * Mac OS X: in version 10.0 and later
  395. */
  396. EXTERN_API_C( void )
  397. InvokeThreadSwitchUPP(
  398. ThreadID threadBeingSwitched,
  399. void * switchProcParam,
  400. ThreadSwitchUPP userUPP);
  401. #if !OPAQUE_UPP_TYPES
  402. #ifdef __cplusplus
  403. inline DEFINE_API_C(void) InvokeThreadSwitchUPP(ThreadID threadBeingSwitched, void * switchProcParam, ThreadSwitchUPP userUPP) { (*userUPP)(threadBeingSwitched, switchProcParam); }
  404. #else
  405. #define InvokeThreadSwitchUPP(threadBeingSwitched, switchProcParam, userUPP) (*userUPP)(threadBeingSwitched, switchProcParam)
  406. #endif
  407. #endif
  408. /*
  409. * InvokeThreadTerminationUPP()
  410. *
  411. * Availability:
  412. * Non-Carbon CFM: available as macro/inline
  413. * CarbonLib: in CarbonLib 1.0 and later
  414. * Mac OS X: in version 10.0 and later
  415. */
  416. EXTERN_API_C( void )
  417. InvokeThreadTerminationUPP(
  418. ThreadID threadTerminated,
  419. void * terminationProcParam,
  420. ThreadTerminationUPP userUPP);
  421. #if !OPAQUE_UPP_TYPES
  422. #ifdef __cplusplus
  423. inline DEFINE_API_C(void) InvokeThreadTerminationUPP(ThreadID threadTerminated, void * terminationProcParam, ThreadTerminationUPP userUPP) { (*userUPP)(threadTerminated, terminationProcParam); }
  424. #else
  425. #define InvokeThreadTerminationUPP(threadTerminated, terminationProcParam, userUPP) (*userUPP)(threadTerminated, terminationProcParam)
  426. #endif
  427. #endif
  428. /*
  429. * InvokeDebuggerNewThreadUPP()
  430. *
  431. * Availability:
  432. * Non-Carbon CFM: available as macro/inline
  433. * CarbonLib: in CarbonLib 1.0 and later
  434. * Mac OS X: in version 10.0 and later
  435. */
  436. EXTERN_API_C( void )
  437. InvokeDebuggerNewThreadUPP(
  438. ThreadID threadCreated,
  439. DebuggerNewThreadUPP userUPP);
  440. #if !OPAQUE_UPP_TYPES
  441. #ifdef __cplusplus
  442. inline DEFINE_API_C(void) InvokeDebuggerNewThreadUPP(ThreadID threadCreated, DebuggerNewThreadUPP userUPP) { (*userUPP)(threadCreated); }
  443. #else
  444. #define InvokeDebuggerNewThreadUPP(threadCreated, userUPP) (*userUPP)(threadCreated)
  445. #endif
  446. #endif
  447. /*
  448. * InvokeDebuggerDisposeThreadUPP()
  449. *
  450. * Availability:
  451. * Non-Carbon CFM: available as macro/inline
  452. * CarbonLib: in CarbonLib 1.0 and later
  453. * Mac OS X: in version 10.0 and later
  454. */
  455. EXTERN_API_C( void )
  456. InvokeDebuggerDisposeThreadUPP(
  457. ThreadID threadDeleted,
  458. DebuggerDisposeThreadUPP userUPP);
  459. #if !OPAQUE_UPP_TYPES
  460. #ifdef __cplusplus
  461. inline DEFINE_API_C(void) InvokeDebuggerDisposeThreadUPP(ThreadID threadDeleted, DebuggerDisposeThreadUPP userUPP) { (*userUPP)(threadDeleted); }
  462. #else
  463. #define InvokeDebuggerDisposeThreadUPP(threadDeleted, userUPP) (*userUPP)(threadDeleted)
  464. #endif
  465. #endif
  466. /*
  467. * InvokeDebuggerThreadSchedulerUPP()
  468. *
  469. * Availability:
  470. * Non-Carbon CFM: available as macro/inline
  471. * CarbonLib: in CarbonLib 1.0 and later
  472. * Mac OS X: in version 10.0 and later
  473. */
  474. EXTERN_API_C( ThreadID )
  475. InvokeDebuggerThreadSchedulerUPP(
  476. SchedulerInfoRecPtr schedulerInfo,
  477. DebuggerThreadSchedulerUPP userUPP);
  478. #if !OPAQUE_UPP_TYPES
  479. #ifdef __cplusplus
  480. inline DEFINE_API_C(ThreadID) InvokeDebuggerThreadSchedulerUPP(SchedulerInfoRecPtr schedulerInfo, DebuggerThreadSchedulerUPP userUPP) { return (*userUPP)(schedulerInfo); }
  481. #else
  482. #define InvokeDebuggerThreadSchedulerUPP(schedulerInfo, userUPP) (*userUPP)(schedulerInfo)
  483. #endif
  484. #endif
  485. /*
  486. Thread Manager function pointers (TPP):
  487. on classic 68k use raw function pointers (same as UPP's)
  488. on classic PowerPC, use raw function pointers
  489. on classic PowerPC with OPAQUE_UPP_TYPES=1, use UPP's
  490. on CFM-68K, use UPP's
  491. on Carbon, use UPP's
  492. */
  493. #if TARGET_OS_MAC && TARGET_CPU_PPC && !OPAQUE_UPP_TYPES
  494. /* use raw function pointers*/
  495. typedef ThreadEntryProcPtr ThreadEntryTPP;
  496. typedef ThreadSchedulerProcPtr ThreadSchedulerTPP;
  497. typedef ThreadSwitchProcPtr ThreadSwitchTPP;
  498. typedef ThreadTerminationProcPtr ThreadTerminationTPP;
  499. typedef DebuggerNewThreadProcPtr DebuggerNewThreadTPP;
  500. typedef DebuggerDisposeThreadProcPtr DebuggerDisposeThreadTPP;
  501. typedef DebuggerThreadSchedulerProcPtr DebuggerThreadSchedulerTPP;
  502. #else
  503. /* use UPP's*/
  504. typedef ThreadEntryUPP ThreadEntryTPP;
  505. typedef ThreadSchedulerUPP ThreadSchedulerTPP;
  506. typedef ThreadSwitchUPP ThreadSwitchTPP;
  507. typedef ThreadTerminationUPP ThreadTerminationTPP;
  508. typedef DebuggerNewThreadUPP DebuggerNewThreadTPP;
  509. typedef DebuggerDisposeThreadUPP DebuggerDisposeThreadTPP;
  510. typedef DebuggerThreadSchedulerUPP DebuggerThreadSchedulerTPP;
  511. #endif /* TARGET_OS_MAC && TARGET_CPU_PPC && !OPAQUE_UPP_TYPES */
  512. /*
  513. * NewThread()
  514. *
  515. * Availability:
  516. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  517. * CarbonLib: in CarbonLib 1.0 and later
  518. * Mac OS X: in version 10.0 and later
  519. */
  520. EXTERN_API( OSErr )
  521. NewThread(
  522. ThreadStyle threadStyle,
  523. ThreadEntryTPP threadEntry,
  524. void * threadParam,
  525. Size stackSize,
  526. ThreadOptions options,
  527. void ** threadResult, /* can be NULL */
  528. ThreadID * threadMade) THREEWORDINLINE(0x303C, 0x0E03, 0xABF2);
  529. /*
  530. * SetThreadScheduler()
  531. *
  532. * Availability:
  533. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  534. * CarbonLib: in CarbonLib 1.0 and later
  535. * Mac OS X: in version 10.0 and later
  536. */
  537. EXTERN_API( OSErr )
  538. SetThreadScheduler(ThreadSchedulerTPP threadScheduler) THREEWORDINLINE(0x303C, 0x0209, 0xABF2);
  539. /*
  540. * SetThreadSwitcher()
  541. *
  542. * Availability:
  543. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  544. * CarbonLib: in CarbonLib 1.0 and later
  545. * Mac OS X: in version 10.0 and later
  546. */
  547. EXTERN_API( OSErr )
  548. SetThreadSwitcher(
  549. ThreadID thread,
  550. ThreadSwitchTPP threadSwitcher,
  551. void * switchProcParam,
  552. Boolean inOrOut) THREEWORDINLINE(0x303C, 0x070A, 0xABF2);
  553. /*
  554. * SetThreadTerminator()
  555. *
  556. * Availability:
  557. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  558. * CarbonLib: in CarbonLib 1.0 and later
  559. * Mac OS X: in version 10.0 and later
  560. */
  561. EXTERN_API( OSErr )
  562. SetThreadTerminator(
  563. ThreadID thread,
  564. ThreadTerminationTPP threadTerminator,
  565. void * terminationProcParam) THREEWORDINLINE(0x303C, 0x0611, 0xABF2);
  566. /*
  567. * SetDebuggerNotificationProcs()
  568. *
  569. * Availability:
  570. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  571. * CarbonLib: in CarbonLib 1.0 and later
  572. * Mac OS X: in version 10.0 and later
  573. */
  574. EXTERN_API( OSErr )
  575. SetDebuggerNotificationProcs(
  576. DebuggerNewThreadTPP notifyNewThread,
  577. DebuggerDisposeThreadTPP notifyDisposeThread,
  578. DebuggerThreadSchedulerTPP notifyThreadScheduler) THREEWORDINLINE(0x303C, 0x060D, 0xABF2);
  579. /*
  580. * CreateThreadPool()
  581. *
  582. * Availability:
  583. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  584. * CarbonLib: in CarbonLib 1.0 and later
  585. * Mac OS X: in version 10.0 and later
  586. */
  587. EXTERN_API( OSErr )
  588. CreateThreadPool(
  589. ThreadStyle threadStyle,
  590. SInt16 numToCreate,
  591. Size stackSize) THREEWORDINLINE(0x303C, 0x0501, 0xABF2);
  592. /*
  593. * GetFreeThreadCount()
  594. *
  595. * Availability:
  596. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  597. * CarbonLib: in CarbonLib 1.0 and later
  598. * Mac OS X: in version 10.0 and later
  599. */
  600. EXTERN_API( OSErr )
  601. GetFreeThreadCount(
  602. ThreadStyle threadStyle,
  603. SInt16 * freeCount) THREEWORDINLINE(0x303C, 0x0402, 0xABF2);
  604. /*
  605. * GetSpecificFreeThreadCount()
  606. *
  607. * Availability:
  608. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  609. * CarbonLib: in CarbonLib 1.0 and later
  610. * Mac OS X: in version 10.0 and later
  611. */
  612. EXTERN_API( OSErr )
  613. GetSpecificFreeThreadCount(
  614. ThreadStyle threadStyle,
  615. Size stackSize,
  616. SInt16 * freeCount) THREEWORDINLINE(0x303C, 0x0615, 0xABF2);
  617. /*
  618. * GetDefaultThreadStackSize()
  619. *
  620. * Availability:
  621. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  622. * CarbonLib: in CarbonLib 1.0 and later
  623. * Mac OS X: in version 10.0 and later
  624. */
  625. EXTERN_API( OSErr )
  626. GetDefaultThreadStackSize(
  627. ThreadStyle threadStyle,
  628. Size * stackSize) THREEWORDINLINE(0x303C, 0x0413, 0xABF2);
  629. /*
  630. * ThreadCurrentStackSpace()
  631. *
  632. * Availability:
  633. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  634. * CarbonLib: in CarbonLib 1.0 and later
  635. * Mac OS X: in version 10.0 and later
  636. */
  637. EXTERN_API( OSErr )
  638. ThreadCurrentStackSpace(
  639. ThreadID thread,
  640. UInt32 * freeStack) THREEWORDINLINE(0x303C, 0x0414, 0xABF2);
  641. /*
  642. * DisposeThread()
  643. *
  644. * Availability:
  645. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  646. * CarbonLib: in CarbonLib 1.0 and later
  647. * Mac OS X: in version 10.0 and later
  648. */
  649. EXTERN_API( OSErr )
  650. DisposeThread(
  651. ThreadID threadToDump,
  652. void * threadResult,
  653. Boolean recycleThread) THREEWORDINLINE(0x303C, 0x0504, 0xABF2);
  654. /*
  655. * YieldToThread()
  656. *
  657. * Availability:
  658. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  659. * CarbonLib: in CarbonLib 1.0 and later
  660. * Mac OS X: in version 10.0 and later
  661. */
  662. EXTERN_API( OSErr )
  663. YieldToThread(ThreadID suggestedThread) THREEWORDINLINE(0x303C, 0x0205, 0xABF2);
  664. /*
  665. * YieldToAnyThread()
  666. *
  667. * Availability:
  668. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  669. * CarbonLib: in CarbonLib 1.0 and later
  670. * Mac OS X: in version 10.0 and later
  671. */
  672. EXTERN_API( OSErr )
  673. YieldToAnyThread(void) FOURWORDINLINE(0x42A7, 0x303C, 0x0205, 0xABF2);
  674. /*
  675. * [Mac]GetCurrentThread()
  676. *
  677. * Availability:
  678. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  679. * CarbonLib: in CarbonLib 1.0 and later
  680. * Mac OS X: in version 10.0 and later
  681. */
  682. #if TARGET_OS_MAC
  683. #define MacGetCurrentThread GetCurrentThread
  684. #endif
  685. EXTERN_API( OSErr )
  686. MacGetCurrentThread(ThreadID * currentThreadID) THREEWORDINLINE(0x303C, 0x0206, 0xABF2);
  687. /*
  688. * GetThreadState()
  689. *
  690. * Availability:
  691. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  692. * CarbonLib: in CarbonLib 1.0 and later
  693. * Mac OS X: in version 10.0 and later
  694. */
  695. EXTERN_API( OSErr )
  696. GetThreadState(
  697. ThreadID threadToGet,
  698. ThreadState * threadState) THREEWORDINLINE(0x303C, 0x0407, 0xABF2);
  699. /*
  700. * SetThreadState()
  701. *
  702. * Availability:
  703. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  704. * CarbonLib: in CarbonLib 1.0 and later
  705. * Mac OS X: in version 10.0 and later
  706. */
  707. EXTERN_API( OSErr )
  708. SetThreadState(
  709. ThreadID threadToSet,
  710. ThreadState newState,
  711. ThreadID suggestedThread) THREEWORDINLINE(0x303C, 0x0508, 0xABF2);
  712. /*
  713. * SetThreadStateEndCritical()
  714. *
  715. * Availability:
  716. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  717. * CarbonLib: in CarbonLib 1.0 and later
  718. * Mac OS X: in version 10.0 and later
  719. */
  720. EXTERN_API( OSErr )
  721. SetThreadStateEndCritical(
  722. ThreadID threadToSet,
  723. ThreadState newState,
  724. ThreadID suggestedThread) THREEWORDINLINE(0x303C, 0x0512, 0xABF2);
  725. /*
  726. * ThreadBeginCritical()
  727. *
  728. * Availability:
  729. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  730. * CarbonLib: in CarbonLib 1.0 and later
  731. * Mac OS X: in version 10.0 and later
  732. */
  733. EXTERN_API( OSErr )
  734. ThreadBeginCritical(void) THREEWORDINLINE(0x303C, 0x000B, 0xABF2);
  735. /*
  736. * ThreadEndCritical()
  737. *
  738. * Availability:
  739. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  740. * CarbonLib: in CarbonLib 1.0 and later
  741. * Mac OS X: in version 10.0 and later
  742. */
  743. EXTERN_API( OSErr )
  744. ThreadEndCritical(void) THREEWORDINLINE(0x303C, 0x000C, 0xABF2);
  745. /*
  746. * GetThreadCurrentTaskRef()
  747. *
  748. * Availability:
  749. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  750. * CarbonLib: in CarbonLib 1.0 and later
  751. * Mac OS X: in version 10.0 and later
  752. */
  753. EXTERN_API( OSErr )
  754. GetThreadCurrentTaskRef(ThreadTaskRef * threadTRef) THREEWORDINLINE(0x303C, 0x020E, 0xABF2);
  755. /*
  756. * GetThreadStateGivenTaskRef()
  757. *
  758. * Availability:
  759. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  760. * CarbonLib: in CarbonLib 1.0 and later
  761. * Mac OS X: in version 10.0 and later
  762. */
  763. EXTERN_API( OSErr )
  764. GetThreadStateGivenTaskRef(
  765. ThreadTaskRef threadTRef,
  766. ThreadID threadToGet,
  767. ThreadState * threadState) THREEWORDINLINE(0x303C, 0x060F, 0xABF2);
  768. /*
  769. * SetThreadReadyGivenTaskRef()
  770. *
  771. * Availability:
  772. * Non-Carbon CFM: in ThreadsLib 1.0 and later
  773. * CarbonLib: in CarbonLib 1.0 and later
  774. * Mac OS X: in version 10.0 and later
  775. */
  776. EXTERN_API( OSErr )
  777. SetThreadReadyGivenTaskRef(
  778. ThreadTaskRef threadTRef,
  779. ThreadID threadToSet) THREEWORDINLINE(0x303C, 0x0410, 0xABF2);
  780. #if PRAGMA_STRUCT_ALIGN
  781. #pragma options align=reset
  782. #elif PRAGMA_STRUCT_PACKPUSH
  783. #pragma pack(pop)
  784. #elif PRAGMA_STRUCT_PACK
  785. #pragma pack()
  786. #endif
  787. #ifdef PRAGMA_IMPORT_OFF
  788. #pragma import off
  789. #elif PRAGMA_IMPORT
  790. #pragma import reset
  791. #endif
  792. #ifdef __cplusplus
  793. }
  794. #endif
  795. #endif /* __THREADS__ */