blitz_thread.h 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129
  1. #ifndef BLITZ_THREAD_H
  2. #define BLITZ_THREAD_H
  3. #ifdef _WIN32
  4. #include <windows.h>
  5. typedef CRITICAL_SECTION bb_mutex_t;
  6. #define bb_mutex_init(MUTPTR) (InitializeCriticalSection(MUTPTR),1)
  7. #define bb_mutex_destroy(MUTPTR) DeleteCriticalSection(MUTPTR)
  8. #define bb_mutex_lock(MUTPTR) EnterCriticalSection(MUTPTR)
  9. #define bb_mutex_unlock(MUTPTR) LeaveCriticalSection(MUTPTR)
  10. #define bb_mutex_trylock(MUTPTR) (TryEnterCriticalSection(MUTPTR)!=0)
  11. /*
  12. typedef HANDLE bb_mutex_t;
  13. #define bb_mutex_init(MUTPTR) ((*(MUTPTR)=CreateMutex(0,0,0))!=0)
  14. #define bb_mutex_destroy(MUTPTR) CloseHandle(*(MUTPTR))
  15. #define bb_mutex_lock(MUTPTR) WaitForSingleObject(*(MUTPTR),INFINITE)
  16. #define bb_mutex_unlock(MUTPTR) ReleaseMutex(*(MUTPTR))
  17. #define bb_mutex_trylock(MUTPTR) (WaitForSingleObject(*(MUTPTR),0 )==WAIT_OBJECT_0)
  18. */
  19. typedef HANDLE bb_sem_t;
  20. #define bb_sem_init(SEMPTR,COUNT) ((*(SEMPTR)=CreateSemaphore(0,(COUNT),0x7fffffff,0))!=0)
  21. #define bb_sem_destroy(SEMPTR) CloseHandle(*(SEMPTR))
  22. #define bb_sem_wait(SEMPTR) WaitForSingleObject(*(SEMPTR),INFINITE)
  23. #define bb_sem_post(SEMPTR) ReleaseSemaphore(*(SEMPTR),1,0)
  24. #else
  25. #include <pthread.h>
  26. typedef pthread_mutex_t bb_mutex_t;
  27. extern pthread_mutexattr_t _bb_mutexattr;
  28. #define bb_mutex_init(MUTPTR) (pthread_mutex_init((MUTPTR),&_bb_mutexattr)>=0)
  29. #define bb_mutex_destroy(MUTPTR) pthread_mutex_destroy(MUTPTR)
  30. #define bb_mutex_lock(MUTPTR) pthread_mutex_lock(MUTPTR)
  31. #define bb_mutex_unlock(MUTPTR) pthread_mutex_unlock(MUTPTR)
  32. #define bb_mutex_trylock(MUTPTR) (pthread_mutex_trylock(MUTPTR)==0)
  33. #endif
  34. #ifdef __APPLE__
  35. #include <mach/semaphore.h>
  36. #include <mach/task.h>
  37. typedef semaphore_t bb_sem_t;
  38. #define bb_sem_init(SEMPTR,COUNT) (semaphore_create( mach_task_self(),(SEMPTR),SYNC_POLICY_FIFO,(COUNT) )>=0)
  39. #define bb_sem_destroy(SEMPTR) semaphore_destroy( mach_task_self(),*(SEMPTR) )
  40. #define bb_sem_wait(SEMPTR) semaphore_wait( *(SEMPTR) )
  41. #define bb_sem_post(SEMPTR) semaphore_signal( *(SEMPTR) )
  42. #endif
  43. #ifdef __linux
  44. #include <semaphore.h>
  45. typedef sem_t bb_sem_t;
  46. #define bb_sem_init(SEMPTR,COUNT) (sem_init((SEMPTR),0,(COUNT))>=0)
  47. #define bb_sem_destroy sem_destroy
  48. #define bb_sem_wait sem_wait
  49. #define bb_sem_post sem_post
  50. #endif
  51. #ifdef _WIN32
  52. #define BB_THREADREGS 7 //via GetThreadContext()
  53. #elif __ppc__
  54. #define BB_THREADREGS 19 //via bbGCRootRegs()
  55. #else
  56. #define BB_THREADREGS 4 //vid bbGCRootRegs()
  57. #endif
  58. #include "blitz_types.h"
  59. typedef BBObject *(*BBThreadProc)( BBObject* );
  60. typedef struct BBThread BBThread;
  61. struct BBThread{
  62. BBThread *succ;
  63. BBThreadProc proc;
  64. void *data[32];
  65. int detached;
  66. void *stackTop;
  67. void *locked_sp;
  68. int locked_regs[BB_THREADREGS];
  69. #ifdef _WIN32
  70. HANDLE handle;
  71. DWORD id;
  72. #else
  73. pthread_t handle;
  74. int suspended;
  75. bb_sem_t runsema;
  76. bb_sem_t acksema;
  77. #endif
  78. };
  79. void bbThreadStartup();
  80. BBThread* bbThreadCreate( BBThreadProc entry,BBObject *data );
  81. void bbThreadDetach( BBThread *thread );
  82. BBObject* bbThreadWait( BBThread *thread );
  83. BBThread* bbThreadGetMain();
  84. BBThread* bbThreadGetCurrent();
  85. int bbThreadSuspend( BBThread *thread );
  86. int bbThreadResume( BBThread *thread );
  87. int bbThreadAllocData();
  88. void bbThreadSetData( int index,BBObject *data );
  89. BBObject* bbThreadGetData( int index );
  90. //These MUST be inside a BB_LOCK/BB_UNLOCK
  91. BBThread* _bbThreadLockThreads();
  92. void _bbThreadUnlockThreads();
  93. int bbAtomicCAS( volatile int *target,int oldVal,int newVal );
  94. int bbAtomicAdd( volatile int *target,int incr );
  95. //Internal locks...
  96. extern int _bbNeedsLock;
  97. extern bb_mutex_t _bbLock;
  98. #define BB_LOCK if( _bbNeedsLock ){ bb_mutex_lock( &_bbLock ); }
  99. #define BB_UNLOCK if( _bbNeedsLock ){ bb_mutex_unlock( &_bbLock ); }
  100. #endif