blitz_thread.h 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #ifndef BLITZ_THREAD_H
  2. #define BLITZ_THREAD_H
  3. #ifdef __cplusplus
  4. extern "C"{
  5. #endif
  6. #ifdef _WIN32
  7. #include <windows.h>
  8. typedef CRITICAL_SECTION bb_mutex_t;
  9. #define bb_mutex_init(MUTPTR) (InitializeCriticalSection(MUTPTR),1)
  10. #define bb_mutex_destroy(MUTPTR) DeleteCriticalSection(MUTPTR)
  11. #define bb_mutex_lock(MUTPTR) EnterCriticalSection(MUTPTR)
  12. #define bb_mutex_unlock(MUTPTR) LeaveCriticalSection(MUTPTR)
  13. #define bb_mutex_trylock(MUTPTR) (TryEnterCriticalSection(MUTPTR)!=0)
  14. /*
  15. typedef HANDLE bb_mutex_t;
  16. #define bb_mutex_init(MUTPTR) ((*(MUTPTR)=CreateMutex(0,0,0))!=0)
  17. #define bb_mutex_destroy(MUTPTR) CloseHandle(*(MUTPTR))
  18. #define bb_mutex_lock(MUTPTR) WaitForSingleObject(*(MUTPTR),INFINITE)
  19. #define bb_mutex_unlock(MUTPTR) ReleaseMutex(*(MUTPTR))
  20. #define bb_mutex_trylock(MUTPTR) (WaitForSingleObject(*(MUTPTR),0 )==WAIT_OBJECT_0)
  21. */
  22. typedef HANDLE bb_sem_t;
  23. #define bb_sem_init(SEMPTR,COUNT) ((*(SEMPTR)=CreateSemaphore(0,(COUNT),0x7fffffff,0))!=0)
  24. #define bb_sem_destroy(SEMPTR) CloseHandle(*(SEMPTR))
  25. #define bb_sem_wait(SEMPTR) WaitForSingleObject(*(SEMPTR),INFINITE)
  26. #define bb_sem_post(SEMPTR) ReleaseSemaphore(*(SEMPTR),1,0)
  27. #define bb_sem_timed_wait(SEMPTR, MILLIS) WaitForSingleObject(*(SEMPTR),MILLIS)
  28. #elif __SWITCH__
  29. #include<switch/kernel/mutex.h>
  30. #include<switch/kernel/semaphore.h>
  31. #include <threads.h>
  32. typedef mtx_t bb_mutex_t;
  33. #define bb_mutex_init(MUTPTR) (mtx_init(MUTPTR,mtx_recursive),1)
  34. #define bb_mutex_destroy(MUTPTR)
  35. #define bb_mutex_lock(MUTPTR) mtx_lock(MUTPTR)
  36. #define bb_mutex_unlock(MUTPTR) mtx_unlock(MUTPTR)
  37. #define bb_mutex_trylock(MUTPTR) (mtx_trylock(MUTPTR)!=0)
  38. typedef Semaphore bb_sem_t;
  39. #define bb_sem_init(SEMPTR,COUNT) (semaphoreInit( (SEMPTR), (COUNT) ), 1)
  40. #define bb_sem_destroy(SEMPTR)
  41. #define bb_sem_wait(SEMPTR) semaphoreWait( (SEMPTR) )
  42. #define bb_sem_post(SEMPTR) semaphoreSignal( (SEMPTR) )
  43. #else
  44. #include <pthread.h>
  45. typedef pthread_mutex_t bb_mutex_t;
  46. extern pthread_mutexattr_t _bb_mutexattr;
  47. #define bb_mutex_init(MUTPTR) (pthread_mutex_init((MUTPTR),&_bb_mutexattr)>=0)
  48. #define bb_mutex_destroy(MUTPTR) pthread_mutex_destroy(MUTPTR)
  49. #define bb_mutex_lock(MUTPTR) pthread_mutex_lock(MUTPTR)
  50. #define bb_mutex_unlock(MUTPTR) pthread_mutex_unlock(MUTPTR)
  51. #define bb_mutex_trylock(MUTPTR) (pthread_mutex_trylock(MUTPTR)==0)
  52. #endif
  53. #ifdef __linux__
  54. #include <semaphore.h>
  55. typedef sem_t bb_sem_t;
  56. #define bb_sem_init(SEMPTR,COUNT) (sem_init((SEMPTR),0,(COUNT))>=0)
  57. #define bb_sem_destroy sem_destroy
  58. #define bb_sem_wait sem_wait
  59. #define bb_sem_post sem_post
  60. #define bb_sem_timed_wait sem_timedwait
  61. #elif __HAIKU__
  62. #include <semaphore.h>
  63. typedef sem_t bb_sem_t;
  64. #define bb_sem_init(SEMPTR,COUNT) (sem_init((SEMPTR),0,(COUNT))>=0)
  65. #define bb_sem_destroy sem_destroy
  66. #define bb_sem_wait sem_wait
  67. #define bb_sem_post sem_post
  68. #define bb_sem_timed_wait sem_timedwait
  69. #endif
  70. #ifdef _WIN32
  71. #define BB_THREADREGS 7 //via GetThreadContext()
  72. #elif __ppc__
  73. #define BB_THREADREGS 19 //via bbGCRootRegs()
  74. #else
  75. #define BB_THREADREGS 4 //vid bbGCRootRegs()
  76. #endif
  77. #include "blitz_types.h"
  78. typedef BBObject *(*BBThreadProc)( BBObject* );
  79. typedef struct BBThread BBThread;
  80. struct BBThread{
  81. BBThread *succ;
  82. BBThreadProc proc;
  83. void *data[32];
  84. int detached;
  85. int locked_regs[BB_THREADREGS];
  86. #ifdef _WIN32
  87. BBObject * result;
  88. HANDLE handle;
  89. DWORD id;
  90. #elif __SWITCH__
  91. thrd_t handle;
  92. #else
  93. pthread_t handle;
  94. #endif
  95. };
  96. void bbThreadPreStartup();
  97. void bbThreadStartup();
  98. BBThread* bbThreadCreate( BBThreadProc entry,BBObject *data );
  99. void bbThreadDetach( BBThread *thread );
  100. BBObject* bbThreadWait( BBThread *thread );
  101. BBThread* bbThreadGetMain();
  102. BBThread* bbThreadGetCurrent();
  103. int bbThreadResume( BBThread *thread );
  104. int bbThreadAllocData();
  105. void bbThreadSetData( int index,BBObject *data );
  106. BBObject* bbThreadGetData( int index );
  107. int bbAtomicCAS( volatile int *target,int oldVal,int newVal );
  108. int bbAtomicAdd( volatile int *target,int incr );
  109. #ifdef _WIN32
  110. BBThread *bbThreadRegister( DWORD id );
  111. #else
  112. BBThread *bbThreadRegister( void * thd );
  113. #endif
  114. void bbThreadUnregister( BBThread * thread );
  115. //Internal locks...
  116. extern int _bbNeedsLock;
  117. extern bb_mutex_t _bbLock;
  118. #define BB_LOCK if( _bbNeedsLock ){ bb_mutex_lock( &_bbLock ); }
  119. #define BB_UNLOCK if( _bbNeedsLock ){ bb_mutex_unlock( &_bbLock ); }
  120. #define BBThreadLocal __thread
  121. #ifdef __cplusplus
  122. }
  123. #endif
  124. #endif