Ignore:
File:
1 edited

Legend:

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

    r8fc652e0 re873838  
    5555                                uint64_t bck_seed;
    5656                        } ready_rng;
    57                 } __cfaabi_tls __attribute__ ((tls_model ( "initial-exec" )));
     57                } kernelTLS __attribute__ ((tls_model ( "initial-exec" )));
    5858
    59                 extern bool __preemption_enabled();
    6059
    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 );
    7160
    7261                static inline uint64_t __tls_rand() {
    7362                        #if defined(__SIZEOF_INT128__)
    74                                 return __lehmer64( kernelTLS().rand_seed );
     63                                return __lehmer64( kernelTLS.rand_seed );
    7564                        #else
    76                                 return __xorshift64( kernelTLS().rand_seed );
     65                                return __xorshift64( kernelTLS.rand_seed );
    7766                        #endif
    7867                }
     
    8675                static inline unsigned __tls_rand_fwd() {
    8776
    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;
    9079                }
    9180
    9281                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);
    9584                        return r;
    9685                }
     
    10392
    10493                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;
    10695                }
    10796        }
    10897
     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();
    109102
     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
    110115
    111116        extern void disable_interrupts();
     
    116121                extern void park( void );
    117122                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 ); }
    123124
    124125                extern bool force_yield( enum __Preemption_Reason );
     
    139140                #if !defined(__CFA_NO_STATISTICS__)
    140141                        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;
    144145                        }
    145146
Note: See TracChangeset for help on using the changeset viewer.