Changeset 21184e3 for libcfa


Ignore:
Timestamp:
Nov 18, 2019, 11:11:24 AM (5 years ago)
Author:
Thierry Delisle <tdelisle@…>
Branches:
ADT, arm-eh, ast-experimental, enum, forall-pointer-decay, jacob/cs343-translation, jenkins-sandbox, master, new-ast, new-ast-unique-expr, pthread-emulation, qualifiedEnum
Children:
57c764c, 7768b8d
Parents:
6559a9d
Message:

Added Thread-Local random number generator to kernel which will be needed for the ready-queue

Location:
libcfa/src
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • libcfa/src/bits/defs.hfa

    r6559a9d r21184e3  
    4747#define OPTIONAL_THREAD __attribute__((weak))
    4848#endif
     49
     50static inline long long rdtscl(void) {
     51    unsigned int lo, hi;
     52    __asm__ __volatile__ ("rdtsc" : "=a"(lo), "=d"(hi));
     53    return ( (unsigned long long)lo)|( ((unsigned long long)hi)<<32 );
     54}
  • libcfa/src/concurrency/invoke.h

    r6559a9d r21184e3  
    4646        #ifdef __cforall
    4747        extern "Cforall" {
    48                 extern thread_local struct KernelThreadData {
     48                extern __attribute__((aligned(128))) thread_local struct KernelThreadData {
    4949                        struct thread_desc    * volatile this_thread;
    5050                        struct processor      * volatile this_processor;
     
    5555                                volatile bool in_progress;
    5656                        } preemption_state;
     57
     58                        uint32_t rand_seed;
    5759                } kernelTLS __attribute__ ((tls_model ( "initial-exec" )));
    5860        }
  • libcfa/src/concurrency/kernel.cfa

    r6559a9d r21184e3  
    133133        NULL,
    134134        NULL,
    135         { 1, false, false }
     135        { 1, false, false },
     136        6u //this should be seeded better but due to a bug calling rdtsc doesn't work
    136137};
    137138
     
    260261//Main of the processor contexts
    261262void main(processorCtx_t & runner) {
     263        // Because of a bug, we couldn't initialized the seed on construction
     264        // Do it here
     265        kernelTLS.rand_seed ^= rdtsc();
     266
    262267        processor * this = runner.proc;
    263268        verify(this);
  • libcfa/src/concurrency/kernel_private.hfa

    r6559a9d r21184e3  
    101101#define KERNEL_STORAGE(T,X) static char storage_##X[sizeof(T)]
    102102
     103static inline uint32_t tls_rand() {
     104        kernelTLS.rand_seed ^= kernelTLS.rand_seed << 6;
     105        kernelTLS.rand_seed ^= kernelTLS.rand_seed >> 21;
     106        kernelTLS.rand_seed ^= kernelTLS.rand_seed << 7;
     107        return kernelTLS.rand_seed;
     108}
     109
    103110
    104111void doregister( struct cluster & cltr );
Note: See TracChangeset for help on using the changeset viewer.