- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/fwd.hfa
r8fc652e0 re873838 55 55 uint64_t bck_seed; 56 56 } ready_rng; 57 } __cfaabi_tls__attribute__ ((tls_model ( "initial-exec" )));57 } kernelTLS __attribute__ ((tls_model ( "initial-exec" ))); 58 58 59 extern bool __preemption_enabled();60 59 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 60 72 61 static inline uint64_t __tls_rand() { 73 62 #if defined(__SIZEOF_INT128__) 74 return __lehmer64( kernelTLS ().rand_seed );63 return __lehmer64( kernelTLS.rand_seed ); 75 64 #else 76 return __xorshift64( kernelTLS ().rand_seed );65 return __xorshift64( kernelTLS.rand_seed ); 77 66 #endif 78 67 } … … 86 75 static inline unsigned __tls_rand_fwd() { 87 76 88 kernelTLS ().ready_rng.fwd_seed = (A * kernelTLS().ready_rng.fwd_seed + C) & (M - 1);89 return kernelTLS ().ready_rng.fwd_seed >> D;77 kernelTLS.ready_rng.fwd_seed = (A * kernelTLS.ready_rng.fwd_seed + C) & (M - 1); 78 return kernelTLS.ready_rng.fwd_seed >> D; 90 79 } 91 80 92 81 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);82 unsigned int r = kernelTLS.ready_rng.bck_seed >> D; 83 kernelTLS.ready_rng.bck_seed = AI * (kernelTLS.ready_rng.bck_seed - C) & (M - 1); 95 84 return r; 96 85 } … … 103 92 104 93 static inline void __tls_rand_advance_bck(void) { 105 kernelTLS ().ready_rng.bck_seed = kernelTLS().ready_rng.fwd_seed;94 kernelTLS.ready_rng.bck_seed = kernelTLS.ready_rng.fwd_seed; 106 95 } 107 96 } 108 97 98 #if 0 // def __ARM_ARCH 99 // function prototypes are only really used by these macros on ARM 100 void disable_global_interrupts(); 101 void enable_global_interrupts(); 109 102 103 #define TL_GET( member ) ( { __typeof__( kernelTLS.member ) target; \ 104 disable_global_interrupts(); \ 105 target = kernelTLS.member; \ 106 enable_global_interrupts(); \ 107 target; } ) 108 #define TL_SET( member, value ) disable_global_interrupts(); \ 109 kernelTLS.member = value; \ 110 enable_global_interrupts(); 111 #else 112 #define TL_GET( member ) kernelTLS.member 113 #define TL_SET( member, value ) kernelTLS.member = value; 114 #endif 110 115 111 116 extern void disable_interrupts(); … … 116 121 extern void park( void ); 117 122 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 } 123 static inline struct $thread * active_thread () { return TL_GET( this_thread ); } 123 124 124 125 extern bool force_yield( enum __Preemption_Reason ); … … 139 140 #if !defined(__CFA_NO_STATISTICS__) 140 141 static inline struct __stats_t * __tls_stats() { 141 /* paranoid */ verify( ! __preemption_enabled());142 /* paranoid */ verify( kernelTLS ().this_stats );143 return kernelTLS ().this_stats;142 /* paranoid */ verify( ! kernelTLS.preemption_state.enabled ); 143 /* paranoid */ verify( kernelTLS.this_stats ); 144 return kernelTLS.this_stats; 144 145 } 145 146
Note:
See TracChangeset
for help on using the changeset viewer.