Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • tests/concurrent/preempt.cfa

    r7b2c8c3c rc701332a  
    1 #include <clock.hfa>
    2 #include <fstream.hfa>
    31#include <kernel.hfa>
    42#include <thread.hfa>
     
    2321extern void __cfaabi_check_preemption();
    2422
    25 static struct {
    26         volatile int counter;
    27         volatile Time prev;
    28         Duration durations[6];
    29 } globals;
     23static volatile int counter = 0;
    3024
    3125thread worker_t {
    3226        int value;
    33         unsigned long long spin;
    3427};
    3528
    3629void ?{}( worker_t & this, int value ) {
    3730        this.value = value;
    38         this.spin = 0;
    3931}
    4032
    4133void main(worker_t & this) {
    42         while(TEST(globals.counter < N)) {
    43                 if(this.spin > 50_000_000_000) abort | "Worker" | this.value | "has been spinning too long! (" | this.spin | ")";
     34        while(TEST(counter < N)) {
    4435                __cfaabi_check_preemption();
    45                 if( (globals.counter % 7) == this.value ) {
     36                if( (counter % 7) == this.value ) {
    4637                        __cfaabi_check_preemption();
    47                         #if !defined(TEST_LONG)
    48                                 Time now = timeHiRes();
    49                                 Duration diff = now - globals.prev;
    50                                 globals.prev = now;
    51                         #endif
    52                         int next = __atomic_add_fetch( &globals.counter, 1, __ATOMIC_SEQ_CST );
     38                        int next = __atomic_add_fetch( &counter, 1, __ATOMIC_SEQ_CST );
    5339                        __cfaabi_check_preemption();
    54                         if( (next % 100) == 0 ) {
    55                                 #if !defined(TEST_LONG)
    56                                         unsigned idx = next / 100;
    57                                         if (idx >= 6) abort | "Idx from next is invalid: " | idx | "vs" | next;
    58                                         globals.durations[idx] = diff;
    59                                         if(diff > 12`s) serr | "Duration suspiciously large:" | diff;
    60                                 #endif
    61                                 printf("%d\n", (int)next);
    62 
    63                         }
     40                        if( (next % 100) == 0 ) printf("%d\n", (int)next);
    6441                        __cfaabi_check_preemption();
    65                         this.spin = 0;
    6642                }
    6743                __cfaabi_check_preemption();
    6844                KICK_WATCHDOG;
    69                 this.spin++;
    7045        }
    7146}
     
    7348int main(int argc, char* argv[]) {
    7449        processor p;
    75         globals.counter = 0;
    76         globals.durations[0] = 0;
    77         globals.durations[1] = 0;
    78         globals.durations[2] = 0;
    79         globals.durations[3] = 0;
    80         globals.durations[4] = 0;
    81         globals.durations[5] = 0;
    8250        {
    83                 globals.prev = timeHiRes();
    8451                worker_t w0 = 0;
    8552                worker_t w1 = 1;
Note: See TracChangeset for help on using the changeset viewer.