| 30 | | $depends_on(/*nothing*/)$atomic{ |
| 31 | | $track(&rs0, &ws0){ // SetStack: S0 |
| 32 | | A; |
| 33 | | $yield; |
| 34 | | $track(&rs1, &ws1){ // SetStack: S0, S1 |
| 35 | | E; |
| 36 | | { |
| 37 | | B; |
| 38 | | } |
| 39 | | X; |
| 40 | | $check; // All var. in sets in SetStack |
| 41 | | } // clean S1 -- var. in B |
| 42 | | C; |
| 43 | | $check; |
| 44 | | } |
| 45 | | } |
| 46 | | }}} |
| 47 | | |
| | 32 | // Init parallel region env. |
| | 33 | $range _omp_thread_range = 0 .. _omp_nthreads - 1; |
| | 34 | $domain(1) _omp_dom = ($domain){_omp_thread_range}; |
| | 35 | $omp_gteam _omp_gteam = $omp_gteam_create($here, _omp_nthreads); |
| | 36 | $for (int _omp_tid: _omp_dom) { |
| | 37 | $depends_on(/*nothing*/)$atomic{ |
| | 38 | $omp_team _omp_team = $omp_team_create($here, _omp_gteam, _omp_tid); |
| | 39 | $track{ // RS stack: rs0; WS stack: ws0; |
| | 40 | // Enter parallel region |
| | 41 | A; |
| | 42 | $yield(); |
| | 43 | $track{ // RS stack: rs0, rs1; WS stack: ws0, ws1; |
| | 44 | $when(_omp_critical_c->value == 0); |
| | 45 | $track{ // Ignore race on lock |
| | 46 | _omp_critical_c->value = 1; // Enter critical block |
| | 47 | } |
| | 48 | B; |
| | 49 | $track{ // Ignore race on lock |
| | 50 | _omp_critical_c->value = 1; // Exit critical block |
| | 51 | } |
| | 52 | $check_data_race(); // 1st check |
| | 53 | } // RS stack: rs0; WS stack: ws0; empty sets rs1, ws1; |
| | 54 | C; |
| | 55 | $check_data_race(); // 2nd check |
| | 56 | } // RS stack: <empty>; WS stack: <empty>; empty sets rs0, ws0; |
| | 57 | } // end $atomic |
| | 58 | } // end $for |
| | 59 | }}} |
| | 60 | |
| | 61 | We denotes Ax as thread x executes statement A. |
| | 62 | Assuming there are two threads t0 and t1, |
| | 63 | the first $check_data_race() checks races between: |
| | 64 | |
| | 65 | A0,A1; A0,B1; A1,B0; B0,C1; B1,C0; |
| | 66 | |
| | 67 | Then, the second $check_data_race() checks races between: |
| | 68 | |
| | 69 | A0,C1; A1,C0; C0,C1; |
| | 70 | |
| | 71 | Races between B0 and B1 are disabled, because B is in critical block. |