source: src/tests/concurrent/waitfor/dtor.c @ ebf0820

ADTaaron-thesisarm-ehast-experimentalcleanup-dtorsdeferred_resndemanglerenumforall-pointer-decayjacob/cs343-translationjenkins-sandboxnew-astnew-ast-unique-exprnew-envno_listpersistent-indexerpthread-emulationqualifiedEnumresolv-newwith_gc
Last change on this file since ebf0820 was 0aa1b89, checked in by Thierry Delisle <tdelisle@…>, 7 years ago

Renamed concurrent tests

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