topical media & game development

talk show tell print

lib-of-vs-libs-QTDevWin-CIncludes-Threads.h / h



  /*
       File:       Threads.h
   
       Contains:   Thread Manager Interfaces.
   
       Version:    Technology: Mac OS 8
                   Release:    QuickTime 6.0.2
   
       Copyright:  (c) 1991-2001 by Apple Computer, Inc., all rights reserved.
   
       Bugs?:      For bug reports, consult the following page on
                   the World Wide Web:
   
                       http://developer.apple.com/bugreporter/
   
  */
  ifndef __THREADS__
  define __THREADS__
  
  ifndef __MACTYPES__
  include <MacTypes.h>
  endif
  
  ifndef __MIXEDMODE__
  include <MixedMode.h>
  endif
  
  ifndef __MACERRORS__
  include <MacErrors.h>
  endif
  
  if PRAGMA_ONCE
  #pragma once
  endif
  
  ifdef __cplusplus
  extern "C" {
  endif
  
  if PRAGMA_IMPORT
  #pragma import on
  endif
  
  if PRAGMA_STRUCT_ALIGN
      #pragma options align=mac68k
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(push, 2)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack(2)
  endif
  
  /* Thread states*/
  
  typedef UInt16 ThreadState;
  enum {
      kReadyThreadState           = 0,
      kStoppedThreadState         = 1,
      kRunningThreadState         = 2
  };
  
  /* Error codes have been meoved to Errors.(pah)*/
  
  /* Thread environment characteristics*/
  typedef void *                          ThreadTaskRef;
  /* Thread characteristics*/
  
  typedef UInt32 ThreadStyle;
  enum {
      kCooperativeThread          = 1L << 0,
      kPreemptiveThread           = 1L << 1
  };
  
  /* Thread identifiers*/
  
  typedef UInt32 ThreadID;
  enum {
      kNoThreadID                 = 0,
      kCurrentThreadID            = 1,
      kApplicationThreadID        = 2
  };
  
  /* Options when creating a thread*/
  
  typedef UInt32 ThreadOptions;
  enum {
      kNewSuspend                 = (1 << 0),
      kUsePremadeThread           = (1 << 1),
      kCreateIfNeeded             = (1 << 2),
      kFPUNotNeeded               = (1 << 3),
      kExactMatchThread           = (1 << 4)
  };
  
  /* Information supplied to the custom scheduler*/
  
  struct SchedulerInfoRec {
      UInt32                          InfoRecSize;
      ThreadID                        CurrentThreadID;
      ThreadID                        SuggestedThreadID;
      ThreadID                        InterruptedCoopThreadID;
  };
  typedef struct SchedulerInfoRec         SchedulerInfoRec;
  typedef SchedulerInfoRec *              SchedulerInfoRecPtr;
  
  /*
      The following ProcPtrs cannot be interchanged with UniversalProcPtrs because
      of differences between 680x0 and PowerPC runtime architectures with regard to
      the implementation of the Thread Manager.
   */
  
  typedef void *                          voidPtr;
  /* Prototype for thread's entry (main) routine*/
  typedef CALLBACK_API( voidPtr , ThreadEntryProcPtr )(void *threadParam);
  /* Prototype for custom thread scheduler routine*/
  typedef CALLBACK_API( ThreadID , ThreadSchedulerProcPtr )(SchedulerInfoRecPtr schedulerInfo);
  /* Prototype for custom thread switcher routine*/
  typedef CALLBACK_API( void , ThreadSwitchProcPtr )(ThreadID threadBeingSwitched, void *switchProcParam);
  /* Prototype for thread termination notification routine*/
  typedef CALLBACK_API( void , ThreadTerminationProcPtr )(ThreadID threadTerminated, void *terminationProcParam);
  /* Prototype for debugger NewThread notification*/
  typedef CALLBACK_API( void , DebuggerNewThreadProcPtr )(ThreadID threadCreated);
  /* Prototype for debugger DisposeThread notification*/
  typedef CALLBACK_API( void , DebuggerDisposeThreadProcPtr )(ThreadID threadDeleted);
  /* Prototype for debugger schedule notification*/
  typedef CALLBACK_API( ThreadID , DebuggerThreadSchedulerProcPtr )(SchedulerInfoRecPtr schedulerInfo);
  typedef TVECTOR_UPP_TYPE(ThreadEntryProcPtr)                    ThreadEntryUPP;
  typedef TVECTOR_UPP_TYPE(ThreadSchedulerProcPtr)                ThreadSchedulerUPP;
  typedef TVECTOR_UPP_TYPE(ThreadSwitchProcPtr)                   ThreadSwitchUPP;
  typedef TVECTOR_UPP_TYPE(ThreadTerminationProcPtr)              ThreadTerminationUPP;
  typedef TVECTOR_UPP_TYPE(DebuggerNewThreadProcPtr)              DebuggerNewThreadUPP;
  typedef TVECTOR_UPP_TYPE(DebuggerDisposeThreadProcPtr)          DebuggerDisposeThreadUPP;
  typedef TVECTOR_UPP_TYPE(DebuggerThreadSchedulerProcPtr)        DebuggerThreadSchedulerUPP;
  if OPAQUE_UPP_TYPES
      EXTERN_API(ThreadEntryUPP)
      NewThreadEntryUPP              (ThreadEntryProcPtr      userRoutine);
  
      EXTERN_API(ThreadSchedulerUPP)
      NewThreadSchedulerUPP          (ThreadSchedulerProcPtr  userRoutine);
  
      EXTERN_API(ThreadSwitchUPP)
      NewThreadSwitchUPP             (ThreadSwitchProcPtr     userRoutine);
  
      EXTERN_API(ThreadTerminationUPP)
      NewThreadTerminationUPP        (ThreadTerminationProcPtr userRoutine);
  
      EXTERN_API(DebuggerNewThreadUPP)
      NewDebuggerNewThreadUPP        (DebuggerNewThreadProcPtr userRoutine);
  
      EXTERN_API(DebuggerDisposeThreadUPP)
      NewDebuggerDisposeThreadUPP    (DebuggerDisposeThreadProcPtr userRoutine);
  
      EXTERN_API(DebuggerThreadSchedulerUPP)
      NewDebuggerThreadSchedulerUPP    (DebuggerThreadSchedulerProcPtr userRoutine);
  
      EXTERN_API(void)
      DisposeThreadEntryUPP          (ThreadEntryUPP          userUPP);
  
      EXTERN_API(void)
      DisposeThreadSchedulerUPP      (ThreadSchedulerUPP      userUPP);
  
      EXTERN_API(void)
      DisposeThreadSwitchUPP         (ThreadSwitchUPP         userUPP);
  
      EXTERN_API(void)
      DisposeThreadTerminationUPP    (ThreadTerminationUPP    userUPP);
  
      EXTERN_API(void)
      DisposeDebuggerNewThreadUPP    (DebuggerNewThreadUPP    userUPP);
  
      EXTERN_API(void)
      DisposeDebuggerDisposeThreadUPP    (DebuggerDisposeThreadUPP userUPP);
  
      EXTERN_API(void)
      DisposeDebuggerThreadSchedulerUPP    (DebuggerThreadSchedulerUPP userUPP);
  
      EXTERN_API(voidPtr)
      InvokeThreadEntryUPP           (void *                  threadParam,
                                      ThreadEntryUPP          userUPP);
  
      EXTERN_API(ThreadID)
      InvokeThreadSchedulerUPP       (SchedulerInfoRecPtr     schedulerInfo,
                                      ThreadSchedulerUPP      userUPP);
  
      EXTERN_API(void)
      InvokeThreadSwitchUPP          (ThreadID                threadBeingSwitched,
                                      void *                  switchProcParam,
                                      ThreadSwitchUPP         userUPP);
  
      EXTERN_API(void)
      InvokeThreadTerminationUPP     (ThreadID                threadTerminated,
                                      void *                  terminationProcParam,
                                      ThreadTerminationUPP    userUPP);
  
      EXTERN_API(void)
      InvokeDebuggerNewThreadUPP     (ThreadID                threadCreated,
                                      DebuggerNewThreadUPP    userUPP);
  
      EXTERN_API(void)
      InvokeDebuggerDisposeThreadUPP    (ThreadID             threadDeleted,
                                      DebuggerDisposeThreadUPP userUPP);
  
      EXTERN_API(ThreadID)
      InvokeDebuggerThreadSchedulerUPP    (SchedulerInfoRecPtr schedulerInfo,
                                      DebuggerThreadSchedulerUPP userUPP);
  
  else
      #define NewThreadEntryUPP(userRoutine)                          (userRoutine)
      #define NewThreadSchedulerUPP(userRoutine)                      (userRoutine)
      #define NewThreadSwitchUPP(userRoutine)                         (userRoutine)
      #define NewThreadTerminationUPP(userRoutine)                    (userRoutine)
      #define NewDebuggerNewThreadUPP(userRoutine)                    (userRoutine)
      #define NewDebuggerDisposeThreadUPP(userRoutine)                (userRoutine)
      #define NewDebuggerThreadSchedulerUPP(userRoutine)              (userRoutine)
      #define DisposeThreadEntryUPP(userUPP)                          
      #define DisposeThreadSchedulerUPP(userUPP)                      
      #define DisposeThreadSwitchUPP(userUPP)                         
      #define DisposeThreadTerminationUPP(userUPP)                    
      #define DisposeDebuggerNewThreadUPP(userUPP)                    
      #define DisposeDebuggerDisposeThreadUPP(userUPP)                
      #define DisposeDebuggerThreadSchedulerUPP(userUPP)              
      #define InvokeThreadEntryUPP(threadParam, userUPP)              (*userUPP)(threadParam)
      #define InvokeThreadSchedulerUPP(schedulerInfo, userUPP)        (*userUPP)(schedulerInfo)
      #define InvokeThreadSwitchUPP(threadBeingSwitched, switchProcParam, userUPP)  (*userUPP)(threadBeingSwitched, switchProcParam)
      #define InvokeThreadTerminationUPP(threadTerminated, terminationProcParam, userUPP)  (*userUPP)(threadTerminated, terminationProcParam)
      #define InvokeDebuggerNewThreadUPP(threadCreated, userUPP)      (*userUPP)(threadCreated)
      #define InvokeDebuggerDisposeThreadUPP(threadDeleted, userUPP)  (*userUPP)(threadDeleted)
      #define InvokeDebuggerThreadSchedulerUPP(schedulerInfo, userUPP)  (*userUPP)(schedulerInfo)
  endif
  /*
     Thread Manager function pointers (TPP):
     on classic 68k use raw function pointers (same as UPP's)
     on classic PowerPC, use raw function pointers
     on CFM-68K, use UPP's
     on Carbon, use UPP's
  */
  
  if TARGET_OS_MAC && TARGET_CPU_PPC && !TARGET_API_MAC_CARBON
  /* use raw function pointers*/
  typedef ThreadEntryProcPtr              ThreadEntryTPP;
  typedef ThreadSchedulerProcPtr          ThreadSchedulerTPP;
  typedef ThreadSwitchProcPtr             ThreadSwitchTPP;
  typedef ThreadTerminationProcPtr        ThreadTerminationTPP;
  typedef DebuggerNewThreadProcPtr        DebuggerNewThreadTPP;
  typedef DebuggerDisposeThreadProcPtr    DebuggerDisposeThreadTPP;
  typedef DebuggerThreadSchedulerProcPtr  DebuggerThreadSchedulerTPP;
  else
  /* use UPP's*/
  typedef ThreadEntryUPP                  ThreadEntryTPP;
  typedef ThreadSchedulerUPP              ThreadSchedulerTPP;
  typedef ThreadSwitchUPP                 ThreadSwitchTPP;
  typedef ThreadTerminationUPP            ThreadTerminationTPP;
  typedef DebuggerNewThreadUPP            DebuggerNewThreadTPP;
  typedef DebuggerDisposeThreadUPP        DebuggerDisposeThreadTPP;
  typedef DebuggerThreadSchedulerUPP      DebuggerThreadSchedulerTPP;
  endif  /* TARGET_OS_MAC && TARGET_CPU_PPC && !TARGET_API_MAC_CARBON */
  
  EXTERN_API( OSErr )
  NewThread                       (ThreadStyle            threadStyle,
                                   ThreadEntryTPP         threadEntry,
                                   void *                 threadParam,
                                   Size                   stackSize,
                                   ThreadOptions          options,
                                   void **                threadResult,
                                   ThreadID *             threadMade)                         THREEWORDINLINE(0x303C, 0x0E03, 0xABF2);
  
  EXTERN_API( OSErr )
  SetThreadScheduler              (ThreadSchedulerTPP     threadScheduler)                    THREEWORDINLINE(0x303C, 0x0209, 0xABF2);
  
  EXTERN_API( OSErr )
  SetThreadSwitcher               (ThreadID               thread,
                                   ThreadSwitchTPP        threadSwitcher,
                                   void *                 switchProcParam,
                                   Boolean                inOrOut)                            THREEWORDINLINE(0x303C, 0x070A, 0xABF2);
  
  EXTERN_API( OSErr )
  SetThreadTerminator             (ThreadID               thread,
                                   ThreadTerminationTPP   threadTerminator,
                                   void *                 terminationProcParam)               THREEWORDINLINE(0x303C, 0x0611, 0xABF2);
  
  EXTERN_API( OSErr )
  SetDebuggerNotificationProcs    (DebuggerNewThreadTPP   notifyNewThread,
                                   DebuggerDisposeThreadTPP  notifyDisposeThread,
                                   DebuggerThreadSchedulerTPP  notifyThreadScheduler)         THREEWORDINLINE(0x303C, 0x060D, 0xABF2);
  
  EXTERN_API( OSErr )
  CreateThreadPool                (ThreadStyle            threadStyle,
                                   SInt16                 numToCreate,
                                   Size                   stackSize)                          THREEWORDINLINE(0x303C, 0x0501, 0xABF2);
  
  EXTERN_API( OSErr )
  GetFreeThreadCount              (ThreadStyle            threadStyle,
                                   SInt16 *               freeCount)                          THREEWORDINLINE(0x303C, 0x0402, 0xABF2);
  
  EXTERN_API( OSErr )
  GetSpecificFreeThreadCount      (ThreadStyle            threadStyle,
                                   Size                   stackSize,
                                   SInt16 *               freeCount)                          THREEWORDINLINE(0x303C, 0x0615, 0xABF2);
  
  EXTERN_API( OSErr )
  GetDefaultThreadStackSize       (ThreadStyle            threadStyle,
                                   Size *                 stackSize)                          THREEWORDINLINE(0x303C, 0x0413, 0xABF2);
  
  EXTERN_API( OSErr )
  ThreadCurrentStackSpace         (ThreadID               thread,
                                   UInt32 *               freeStack)                          THREEWORDINLINE(0x303C, 0x0414, 0xABF2);
  
  EXTERN_API( OSErr )
  DisposeThread                   (ThreadID               threadToDump,
                                   void *                 threadResult,
                                   Boolean                recycleThread)                      THREEWORDINLINE(0x303C, 0x0504, 0xABF2);
  
  EXTERN_API( OSErr )
  YieldToThread                   (ThreadID               suggestedThread)                    THREEWORDINLINE(0x303C, 0x0205, 0xABF2);
  
  EXTERN_API( OSErr )
  YieldToAnyThread                (void)                                                      FOURWORDINLINE(0x42A7, 0x303C, 0x0205, 0xABF2);
  
  if TARGET_OS_MAC
      #define MacGetCurrentThread GetCurrentThread
  endif
  EXTERN_API( OSErr )
  MacGetCurrentThread             (ThreadID *             currentThreadID)                    THREEWORDINLINE(0x303C, 0x0206, 0xABF2);
  
  EXTERN_API( OSErr )
  GetThreadState                  (ThreadID               threadToGet,
                                   ThreadState *          threadState)                        THREEWORDINLINE(0x303C, 0x0407, 0xABF2);
  
  EXTERN_API( OSErr )
  SetThreadState                  (ThreadID               threadToSet,
                                   ThreadState            newState,
                                   ThreadID               suggestedThread)                    THREEWORDINLINE(0x303C, 0x0508, 0xABF2);
  
  EXTERN_API( OSErr )
  SetThreadStateEndCritical       (ThreadID               threadToSet,
                                   ThreadState            newState,
                                   ThreadID               suggestedThread)                    THREEWORDINLINE(0x303C, 0x0512, 0xABF2);
  
  EXTERN_API( OSErr )
  ThreadBeginCritical             (void)                                                      THREEWORDINLINE(0x303C, 0x000B, 0xABF2);
  
  EXTERN_API( OSErr )
  ThreadEndCritical               (void)                                                      THREEWORDINLINE(0x303C, 0x000C, 0xABF2);
  
  EXTERN_API( OSErr )
  GetThreadCurrentTaskRef         (ThreadTaskRef *        threadTRef)                         THREEWORDINLINE(0x303C, 0x020E, 0xABF2);
  
  EXTERN_API( OSErr )
  GetThreadStateGivenTaskRef      (ThreadTaskRef          threadTRef,
                                   ThreadID               threadToGet,
                                   ThreadState *          threadState)                        THREEWORDINLINE(0x303C, 0x060F, 0xABF2);
  
  EXTERN_API( OSErr )
  SetThreadReadyGivenTaskRef      (ThreadTaskRef          threadTRef,
                                   ThreadID               threadToSet)                        THREEWORDINLINE(0x303C, 0x0410, 0xABF2);
  
  if PRAGMA_STRUCT_ALIGN
      #pragma options align=reset
  #elif PRAGMA_STRUCT_PACKPUSH
      #pragma pack(pop)
  #elif PRAGMA_STRUCT_PACK
      #pragma pack()
  endif
  
  ifdef PRAGMA_IMPORT_OFF
  #pragma import off
  #elif PRAGMA_IMPORT
  #pragma import reset
  endif
  
  ifdef __cplusplus
  }
  endif
  
  endif /* __THREADS__ */
  
  


(C) Æliens 04/09/2009

You may not copy or print any of this material without explicit permission of the author or the publisher. In case of other copyright issues, contact the author.