- File:
-
- 1 edited
-
libcfa/src/concurrency/kernel/fwd.hfa (modified) (6 diffs)
Legend:
- Unmodified
- Added
- Removed
-
libcfa/src/concurrency/kernel/fwd.hfa
re235429 r8fc652e0 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 __stats_t * volatile this_stats; 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; 40 41 41 42 struct { … … 54 55 uint64_t bck_seed; 55 56 } ready_rng; 56 } kernelTLS__attribute__ ((tls_model ( "initial-exec" )));57 } __cfaabi_tls __attribute__ ((tls_model ( "initial-exec" ))); 57 58 59 extern bool __preemption_enabled(); 58 60 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 ); 59 71 60 72 static inline uint64_t __tls_rand() { 61 73 #if defined(__SIZEOF_INT128__) 62 return __lehmer64( kernelTLS .rand_seed );74 return __lehmer64( kernelTLS().rand_seed ); 63 75 #else 64 return __xorshift64( kernelTLS .rand_seed );76 return __xorshift64( kernelTLS().rand_seed ); 65 77 #endif 66 78 } … … 74 86 static inline unsigned __tls_rand_fwd() { 75 87 76 kernelTLS .ready_rng.fwd_seed = (A * kernelTLS.ready_rng.fwd_seed + C) & (M - 1);77 return kernelTLS .ready_rng.fwd_seed >> D;88 kernelTLS().ready_rng.fwd_seed = (A * kernelTLS().ready_rng.fwd_seed + C) & (M - 1); 89 return kernelTLS().ready_rng.fwd_seed >> D; 78 90 } 79 91 80 92 static inline unsigned __tls_rand_bck() { 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);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); 83 95 return r; 84 96 } … … 91 103 92 104 static inline void __tls_rand_advance_bck(void) { 93 kernelTLS .ready_rng.bck_seed = kernelTLS.ready_rng.fwd_seed;105 kernelTLS().ready_rng.bck_seed = kernelTLS().ready_rng.fwd_seed; 94 106 } 95 107 } 96 108 97 #if 0 // def __ARM_ARCH98 // function prototypes are only really used by these macros on ARM99 void disable_global_interrupts();100 void enable_global_interrupts();101 109 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 #else111 #define TL_GET( member ) kernelTLS.member112 #define TL_SET( member, value ) kernelTLS.member = value;113 #endif114 110 115 111 extern void disable_interrupts(); … … 120 116 extern void park( void ); 121 117 extern void unpark( struct $thread * this ); 122 static inline struct $thread * active_thread () { return TL_GET( this_thread ); } 118 static inline struct $thread * active_thread () { 119 struct $thread * t = publicTLS_get( this_thread ); 120 /* paranoid */ verify( t ); 121 return t; 122 } 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( ! kernelTLS.preemption_state.enabled);142 /* paranoid */ verify( kernelTLS .this_stats );143 return kernelTLS .this_stats;141 /* paranoid */ verify( ! __preemption_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.