Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • src/tests/sched-int-wait.c

    r19801aa r9737ffe  
    44#include <stdlib>
    55#include <thread>
    6 
    7 static const int N = 10_000;
    86
    97monitor global_t {};
     
    1513condition condAB, condAC, condBC, condABC;
    1614
    17 thread Signaler {};
     15thread Signaler {
     16        int signals[4];
     17};
     18
     19void ?{}( Signaler * this ){
     20        this->signals[0] = 0;
     21        this->signals[1] = 0;
     22        this->signals[2] = 0;
     23        this->signals[3] = 0;
     24}
     25
    1826thread WaiterAB {};
    1927thread WaiterAC {};
     
    2129thread WaiterABC{};
    2230
    23 volatile int waiter_left;
     31volatile bool done;
    2432
    2533//----------------------------------------------------------------------------------------------------
     
    4553void main( Signaler* this ) {
    4654
    47         while( waiter_left != 0 ) {
    48                 unsigned action = (unsigned)rand48() % 4;
     55        while( true ) {
     56                int action = (unsigned)rand48() % 4;
     57                bool finished = true;
     58
     59                for(int i = 0; i < 4; i++) {
     60                        if( this->signals[action] < 10_000 ) {
     61                                finished = false;
     62                                break;
     63                        }
     64                        else {
     65                                action = (action + 1) % 4;
     66                        }
     67                }
     68
     69                this->signals[action]++;
     70                if( finished ) break;
     71
     72                //sout | action | this->signals[0] | this->signals[1] | this->signals[2] | this->signals[3] | endl;
     73
    4974                switch( action ) {
    5075                        case 0:
     
    6489                                abort();
    6590                }
    66                 yield();
    6791        }       
    6892}
     
    7195// Waiter ABC
    7296void main( WaiterABC* this ) {
    73         for( int i = 0; i < N; i++ ) {
     97        while( !done ) {
    7498                wait( &condABC, &globalA, &globalB, &globalC );
    7599        }
    76 
    77         __sync_fetch_and_sub_4( &waiter_left, 1);
    78100}
    79101
     
    81103// Waiter AB
    82104void main( WaiterAB* this ) {
    83         for( int i = 0; i < N; i++ ) {
     105        while( !done ) {
    84106                wait( &condAB , &globalA, &globalB );
    85107        }
    86 
    87         __sync_fetch_and_sub_4( &waiter_left, 1);
    88108}
    89109
     
    91111// Waiter AC
    92112void main( WaiterAC* this ) {
    93         for( int i = 0; i < N; i++ ) {
     113        while( !done ) {
    94114                wait( &condAC , &globalA, &globalC );
    95115        }
    96 
    97         __sync_fetch_and_sub_4( &waiter_left, 1);
    98116}
    99117
     
    101119// Waiter BC
    102120void main( WaiterBC* this ) {
    103         for( int i = 0; i < N; i++ ) {
     121        while( !done ) {
    104122                wait( &condBC , &globalB, &globalC );
    105123        }
    106 
    107         __sync_fetch_and_sub_4( &waiter_left, 1);
    108124}
    109125
     
    111127// Main
    112128int main(int argc, char* argv[]) {
    113         waiter_left = 4;
     129        done = false;
    114130        processor p;
    115131        {
    116                 Signaler  e;
     132                WaiterABC a;
     133                WaiterAB  b;
     134                WaiterBC  c;
     135                WaiterAC  d;
    117136                {
    118                         WaiterABC a;
    119                         WaiterAB  b;
    120                         WaiterBC  c;
    121                         WaiterAC  d;
     137                        Signaler  e;
    122138                }
     139                done = true;
     140                signal( &condABC, &globalA, &globalB, &globalC );
     141                signal( &condAB , &globalA, &globalB );
     142                signal( &condBC , &globalB, &globalC );
     143                signal( &condAC , &globalA, &globalC );
    123144        }
    124145}
Note: See TracChangeset for help on using the changeset viewer.