Changeset 3e2b9c9 for libcfa/src/concurrency/kernel/fwd.hfa
- Timestamp:
- Aug 3, 2020, 1:59:13 PM (4 years ago)
- Branches:
- ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
- Children:
- 95789be
- Parents:
- e660761
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/fwd.hfa
re660761 r3e2b9c9 14 14 // 15 15 16 #pragma once 17 16 18 #include "bits/defs.hfa" 17 19 #include "bits/debug.hfa" 18 20 19 #if !defined(__cforall_thread__)20 # error non-thread source file includes kernel/fwd.hfa21 #ifdef __cforall 22 #include "bits/random.hfa" 21 23 #endif 22 24 … … 25 27 struct cluster; 26 28 29 enum __Preemption_Reason { __NO_PREEMPTION, __ALARM_PREEMPTION, __POLL_PREEMPTION, __MANUAL_PREEMPTION }; 30 31 #define KERNEL_STORAGE(T,X) __attribute((aligned(__alignof__(T)))) static char storage_##X[sizeof(T)] 32 27 33 #ifdef __cforall 28 34 extern "C" { 29 35 extern "Cforall" { 30 36 extern __attribute__((aligned(128))) thread_local struct KernelThreadData { 31 37 struct $thread * volatile this_thread; … … 45 51 #endif 46 52 } kernelTLS __attribute__ ((tls_model ( "initial-exec" ))); 53 54 static inline uint64_t __tls_rand() { 55 #if defined(__SIZEOF_INT128__) 56 return __lehmer64( kernelTLS.rand_seed ); 57 #else 58 return __xorshift64( kernelTLS.rand_seed ); 59 #endif 60 } 47 61 } 48 62 49 50 51 52 63 #ifdef __ARM_ARCH 64 // function prototypes are only really used by these macros on ARM 65 void disable_global_interrupts(); 66 void enable_global_interrupts(); 53 67 54 55 56 57 58 59 60 61 62 63 64 65 68 #define TL_GET( member ) ( { __typeof__( kernelTLS.member ) target; \ 69 disable_global_interrupts(); \ 70 target = kernelTLS.member; \ 71 enable_global_interrupts(); \ 72 target; } ) 73 #define TL_SET( member, value ) disable_global_interrupts(); \ 74 kernelTLS.member = value; \ 75 enable_global_interrupts(); 76 #else 77 #define TL_GET( member ) kernelTLS.member 78 #define TL_SET( member, value ) kernelTLS.member = value; 79 #endif 66 80 67 68 81 extern void disable_interrupts(); 82 extern void enable_interrupts_noPoll(); 69 83 extern void enable_interrupts( __cfaabi_dbg_ctx_param ); 70 84 71 enum __Preemption_Reason { __NO_PREEMPTION, __ALARM_PREEMPTION, __POLL_PREEMPTION, __MANUAL_PREEMPTION }; 85 extern "Cforall" { 86 extern void park( __cfaabi_dbg_ctx_param ); 87 extern void unpark( struct $thread * this __cfaabi_dbg_ctx_param2 ); 88 static inline struct $thread * active_thread () { return TL_GET( this_thread ); } 72 89 73 extern "Cforall" { 74 extern void park( __cfaabi_dbg_ctx_param ); 75 extern void unpark( struct $thread * this __cfaabi_dbg_ctx_param2 ); 76 static inline struct $thread * active_thread () { return TL_GET( this_thread ); } 90 extern bool force_yield( enum __Preemption_Reason ); 77 91 78 extern bool force_yield( enum __Preemption_Reason ); 79 } 92 static inline void yield() { 93 force_yield(__MANUAL_PREEMPTION); 94 } 95 96 // Yield: yield N times 97 static inline void yield( unsigned times ) { 98 for( times ) { 99 yield(); 100 } 101 } 102 103 //----------------------------------------------------------------------- 104 // Statics call at the end of each thread to register statistics 105 #if !defined(__CFA_NO_STATISTICS__) 106 static inline struct __stats_t * __tls_stats() { 107 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 108 /* paranoid */ verify( kernelTLS.this_stats ); 109 return kernelTLS.this_stats; 110 } 111 112 #define __STATS__(in_kernel, ...) { \ 113 if( !(in_kernel) ) disable_interrupts(); \ 114 with( *__tls_stats() ) { \ 115 __VA_ARGS__ \ 116 } \ 117 if( !(in_kernel) ) enable_interrupts( __cfaabi_dbg_ctx ); \ 118 } 119 #else 120 #define __STATS__(in_kernel, ...) 121 #endif 122 } 80 123 } 81 124 #endif
Note: See TracChangeset
for help on using the changeset viewer.