- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel/fwd.hfa (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/fwd.hfa
r8fc652e0 re235429 35 35 extern "Cforall" { 36 36 extern __attribute__((aligned(128))) thread_local struct KernelThreadData { 37 struct $thread * volatile this_thread; 38 struct processor * volatile this_processor; 39 struct __processor_id_t * volatile this_proc_id; 40 struct __stats_t * volatile this_stats; 37 struct $thread * volatile this_thread; 38 struct processor * volatile this_processor; 39 struct __stats_t * volatile this_stats; 41 40 42 41 struct { … … 55 54 uint64_t bck_seed; 56 55 } ready_rng; 57 } __cfaabi_tls__attribute__ ((tls_model ( "initial-exec" )));56 } kernelTLS __attribute__ ((tls_model ( "initial-exec" ))); 58 57 59 extern bool __preemption_enabled();60 58 61 static inline KernelThreadData & kernelTLS( void ) {62 /* paranoid */ verify( ! __preemption_enabled() );63 return __cfaabi_tls;64 }65 66 extern uintptr_t __cfatls_get( unsigned long int member );67 // #define publicTLS_get( member ) ((typeof(__cfaabi_tls.member))__cfatls_get( __builtin_offsetof(KernelThreadData, member) ))68 #define publicTLS_get( member ) (__cfaabi_tls.member)69 // extern forall(otype T) T __cfatls_get( T * member, T value );70 // #define publicTLS_set( member, value ) __cfatls_set( (typeof(member)*)__builtin_offsetof(KernelThreadData, member), value );71 59 72 60 static inline uint64_t __tls_rand() { 73 61 #if defined(__SIZEOF_INT128__) 74 return __lehmer64( kernelTLS ().rand_seed );62 return __lehmer64( kernelTLS.rand_seed ); 75 63 #else 76 return __xorshift64( kernelTLS ().rand_seed );64 return __xorshift64( kernelTLS.rand_seed ); 77 65 #endif 78 66 } … … 86 74 static inline unsigned __tls_rand_fwd() { 87 75 88 kernelTLS ().ready_rng.fwd_seed = (A * kernelTLS().ready_rng.fwd_seed + C) & (M - 1);89 return kernelTLS ().ready_rng.fwd_seed >> D;76 kernelTLS.ready_rng.fwd_seed = (A * kernelTLS.ready_rng.fwd_seed + C) & (M - 1); 77 return kernelTLS.ready_rng.fwd_seed >> D; 90 78 } 91 79 92 80 static inline unsigned __tls_rand_bck() { 93 unsigned int r = kernelTLS ().ready_rng.bck_seed >> D;94 kernelTLS ().ready_rng.bck_seed = AI * (kernelTLS().ready_rng.bck_seed - C) & (M - 1);81 unsigned int r = kernelTLS.ready_rng.bck_seed >> D; 82 kernelTLS.ready_rng.bck_seed = AI * (kernelTLS.ready_rng.bck_seed - C) & (M - 1); 95 83 return r; 96 84 } … … 103 91 104 92 static inline void __tls_rand_advance_bck(void) { 105 kernelTLS ().ready_rng.bck_seed = kernelTLS().ready_rng.fwd_seed;93 kernelTLS.ready_rng.bck_seed = kernelTLS.ready_rng.fwd_seed; 106 94 } 107 95 } 108 96 97 #if 0 // def __ARM_ARCH 98 // function prototypes are only really used by these macros on ARM 99 void disable_global_interrupts(); 100 void enable_global_interrupts(); 109 101 102 #define TL_GET( member ) ( { __typeof__( kernelTLS.member ) target; \ 103 disable_global_interrupts(); \ 104 target = kernelTLS.member; \ 105 enable_global_interrupts(); \ 106 target; } ) 107 #define TL_SET( member, value ) disable_global_interrupts(); \ 108 kernelTLS.member = value; \ 109 enable_global_interrupts(); 110 #else 111 #define TL_GET( member ) kernelTLS.member 112 #define TL_SET( member, value ) kernelTLS.member = value; 113 #endif 110 114 111 115 extern void disable_interrupts(); … … 116 120 extern void park( void ); 117 121 extern void unpark( struct $thread * this ); 118 static inline struct $thread * active_thread () { 119 struct $thread * t = publicTLS_get( this_thread ); 120 /* paranoid */ verify( t ); 121 return t; 122 } 122 static inline struct $thread * active_thread () { return TL_GET( this_thread ); } 123 123 124 124 extern bool force_yield( enum __Preemption_Reason ); … … 139 139 #if !defined(__CFA_NO_STATISTICS__) 140 140 static inline struct __stats_t * __tls_stats() { 141 /* paranoid */ verify( ! __preemption_enabled());142 /* paranoid */ verify( kernelTLS ().this_stats );143 return kernelTLS ().this_stats;141 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 142 /* paranoid */ verify( kernelTLS.this_stats ); 143 return kernelTLS.this_stats; 144 144 } 145 145
Note:
See TracChangeset
for help on using the changeset viewer.