Ignore:
Timestamp:
Aug 3, 2020, 1:59:13 PM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
95789be
Parents:
e660761
Message:

More restructuring of translation units
Unclear if it improves compilation time.

Location:
libcfa/src/concurrency/kernel
Files:
2 edited

Legend:

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

    re660761 r3e2b9c9  
    1414//
    1515
     16#pragma once
     17
    1618#include "bits/defs.hfa"
    1719#include "bits/debug.hfa"
    1820
    19 #if !defined(__cforall_thread__)
    20 #error non-thread source file includes kernel/fwd.hfa
     21#ifdef __cforall
     22#include "bits/random.hfa"
    2123#endif
    2224
     
    2527struct cluster;
    2628
     29enum __Preemption_Reason { __NO_PREEMPTION, __ALARM_PREEMPTION, __POLL_PREEMPTION, __MANUAL_PREEMPTION };
     30
     31#define KERNEL_STORAGE(T,X) __attribute((aligned(__alignof__(T)))) static char storage_##X[sizeof(T)]
     32
    2733#ifdef __cforall
    2834extern "C" {
    29       extern "Cforall" {
     35        extern "Cforall" {
    3036                extern __attribute__((aligned(128))) thread_local struct KernelThreadData {
    3137                        struct $thread    * volatile this_thread;
     
    4551                        #endif
    4652                } kernelTLS __attribute__ ((tls_model ( "initial-exec" )));
     53
     54                static inline uint64_t __tls_rand() {
     55                        #if defined(__SIZEOF_INT128__)
     56                                return __lehmer64( kernelTLS.rand_seed );
     57                        #else
     58                                return __xorshift64( kernelTLS.rand_seed );
     59                        #endif
     60                }
    4761        }
    4862
    49       #ifdef __ARM_ARCH
    50             // function prototypes are only really used by these macros on ARM
    51             void disable_global_interrupts();
    52             void enable_global_interrupts();
     63        #ifdef __ARM_ARCH
     64                // function prototypes are only really used by these macros on ARM
     65                void disable_global_interrupts();
     66                void enable_global_interrupts();
    5367
    54             #define TL_GET( member ) ( { __typeof__( kernelTLS.member ) target; \
    55                   disable_global_interrupts(); \
    56                   target = kernelTLS.member; \
    57                   enable_global_interrupts(); \
    58                   target; } )
    59             #define TL_SET( member, value ) disable_global_interrupts(); \
    60                   kernelTLS.member = value; \
    61                   enable_global_interrupts();
    62       #else
    63             #define TL_GET( member ) kernelTLS.member
    64             #define TL_SET( member, value ) kernelTLS.member = value;
    65       #endif
     68                #define TL_GET( member ) ( { __typeof__( kernelTLS.member ) target; \
     69                        disable_global_interrupts(); \
     70                        target = kernelTLS.member; \
     71                        enable_global_interrupts(); \
     72                        target; } )
     73                #define TL_SET( member, value ) disable_global_interrupts(); \
     74                        kernelTLS.member = value; \
     75                        enable_global_interrupts();
     76        #else
     77                #define TL_GET( member ) kernelTLS.member
     78                #define TL_SET( member, value ) kernelTLS.member = value;
     79        #endif
    6680
    67       extern void disable_interrupts();
    68       extern void enable_interrupts_noPoll();
     81        extern void disable_interrupts();
     82        extern void enable_interrupts_noPoll();
    6983        extern void enable_interrupts( __cfaabi_dbg_ctx_param );
    7084
    71         enum __Preemption_Reason { __NO_PREEMPTION, __ALARM_PREEMPTION, __POLL_PREEMPTION, __MANUAL_PREEMPTION };
     85        extern "Cforall" {
     86                extern void park( __cfaabi_dbg_ctx_param );
     87                extern void unpark( struct $thread * this __cfaabi_dbg_ctx_param2 );
     88                static inline struct $thread * active_thread () { return TL_GET( this_thread ); }
    7289
    73       extern "Cforall" {
    74             extern void park( __cfaabi_dbg_ctx_param );
    75             extern void unpark( struct $thread * this __cfaabi_dbg_ctx_param2 );
    76             static inline struct $thread * active_thread () { return TL_GET( this_thread ); }
     90                extern bool force_yield( enum __Preemption_Reason );
    7791
    78             extern bool force_yield( enum __Preemption_Reason );
    79       }
     92                static inline void yield() {
     93                        force_yield(__MANUAL_PREEMPTION);
     94                }
     95
     96                // Yield: yield N times
     97                static inline void yield( unsigned times ) {
     98                        for( times ) {
     99                                yield();
     100                        }
     101                }
     102
     103                //-----------------------------------------------------------------------
     104                // Statics call at the end of each thread to register statistics
     105                #if !defined(__CFA_NO_STATISTICS__)
     106                        static inline struct __stats_t * __tls_stats() {
     107                                /* paranoid */ verify( ! kernelTLS.preemption_state.enabled );
     108                                /* paranoid */ verify( kernelTLS.this_stats );
     109                                return kernelTLS.this_stats;
     110                        }
     111
     112                        #define __STATS__(in_kernel, ...) { \
     113                                if( !(in_kernel) ) disable_interrupts(); \
     114                                with( *__tls_stats() ) { \
     115                                        __VA_ARGS__ \
     116                                } \
     117                                if( !(in_kernel) ) enable_interrupts( __cfaabi_dbg_ctx ); \
     118                        }
     119                #else
     120                        #define __STATS__(in_kernel, ...)
     121                #endif
     122        }
    80123}
    81124#endif
  • libcfa/src/concurrency/kernel/startup.cfa

    re660761 r3e2b9c9  
    9191//-----------------------------------------------------------------------------
    9292// Kernel storage
    93 #warning duplicated in preemption.cfa
    94 #define KERNEL_STORAGE(T,X) __attribute((aligned(__alignof__(T)))) static char storage_##X[sizeof(T)]
    9593KERNEL_STORAGE(cluster,              mainCluster);
    9694KERNEL_STORAGE(processor,            mainProcessor);
Note: See TracChangeset for help on using the changeset viewer.