Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/concurrency/kernel/fwd.hfa

    re235429 r8fc652e0  
    3535        extern "Cforall" {
    3636                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;
    4041
    4142                        struct {
     
    5455                                uint64_t bck_seed;
    5556                        } ready_rng;
    56                 } kernelTLS __attribute__ ((tls_model ( "initial-exec" )));
     57                } __cfaabi_tls __attribute__ ((tls_model ( "initial-exec" )));
    5758
     59                extern bool __preemption_enabled();
    5860
     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 );
    5971
    6072                static inline uint64_t __tls_rand() {
    6173                        #if defined(__SIZEOF_INT128__)
    62                                 return __lehmer64( kernelTLS.rand_seed );
     74                                return __lehmer64( kernelTLS().rand_seed );
    6375                        #else
    64                                 return __xorshift64( kernelTLS.rand_seed );
     76                                return __xorshift64( kernelTLS().rand_seed );
    6577                        #endif
    6678                }
     
    7486                static inline unsigned __tls_rand_fwd() {
    7587
    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;
    7890                }
    7991
    8092                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);
    8395                        return r;
    8496                }
     
    91103
    92104                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;
    94106                }
    95107        }
    96108
    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();
    101109
    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
    114110
    115111        extern void disable_interrupts();
     
    120116                extern void park( void );
    121117                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                }
    123123
    124124                extern bool force_yield( enum __Preemption_Reason );
     
    139139                #if !defined(__CFA_NO_STATISTICS__)
    140140                        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;
    144144                        }
    145145
Note: See TracChangeset for help on using the changeset viewer.