blitz_thread.h 4.4 KB

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