source: tests/concurrency/waitfor/dtor.cfa @ ad47ec4

Last change on this file since ad47ec4 was c26bea2a, checked in by Peter A. Buhr <pabuhr@…>, 18 months ago

first attempt at renaming directory tests/concurrent to tests/concurrency to harmonize with other concurrency directory names

  • Property mode set to 100644
File size: 1.5 KB
Line 
1//---------------------------------------------------------
2// Barging test
3// Ensures the statement order is reverse when using waitfor ^?{}
4//---------------------------------------------------------
5
6#include <fstream.hfa>
7#include <kernel.hfa>
8#include <monitor.hfa>
9#include <stdlib.hfa>
10#include <thread.hfa>
11
12#include <stdbool.h>
13
14static const unsigned long N = 5_000ul;
15
16enum state_t {
17        CTOR,
18        MAIN,
19        AFTER,
20        END,
21        DTOR
22};
23
24thread dummy_t {
25        state_t state;
26};
27
28static inline void set_state( dummy_t & this, state_t state) {
29        switch(state) {
30                case CTOR  : break;
31                case MAIN  : if( this.state != CTOR  ) { serr | "ERROR Expected state to be CTOR" ; abort(); } this.state = state; break;
32                case AFTER : if( this.state != MAIN  ) { serr | "ERROR Expected state to be MAIN" ; abort(); } this.state = state; break;
33                case END   : if( this.state != AFTER ) { serr | "ERROR Expected state to be AFTER"; abort(); } this.state = state; break;
34                case DTOR  : if( this.state != END   ) { serr | "ERROR Expected state to be END"  ; abort(); } this.state = state; break;
35        }
36}
37
38void ^?{}( dummy_t & mutex this ) {
39        set_state( this, DTOR );
40}
41
42void ?{}( dummy_t & this ) {
43        this.state = CTOR;
44}
45
46void main( dummy_t & this ) {
47        yield(random( 10 ));
48        set_state( this, MAIN );
49        waitfor( ^?{} : this ) {
50                set_state( this, AFTER );
51        }
52        set_state( this, END );
53}
54
55int main() {
56        sout | "Starting";
57        processor p;
58        for( int i = 0; i < N; i++ ){
59                dummy_t dummy[4];
60                yield( random( 100 ) );
61        }
62        sout | "Stopping";
63}
Note: See TracBrowser for help on using the repository browser.