| 12 | | 3. A barrier is transformed as: barrier() ; check(); clean_all(); barrier(); |
| 13 | | 4. In a $track{..} scope, both read and write operations of shared variables are tracked for checking data race. |
| 14 | | ($tracked_reads() and $tracked_writes() are functions returning a set containing all shared variables read or written.) |
| | 12 | 3. A barrier is transformed as: barrier() ; $check_data_race(); $track_clean(); barrier(); |
| | 13 | 4. Read and write operations are tracked in $atomic scope and functions of tracking read/write operations are: |
| | 14 | - {{{$track{}}} . . . . . . . . . . . . . . . . creates a new pair of read/write sets for tracking. |
| | 15 | - {{{} // end of $track scope}}} . . removes read/write sets currently used for tracking. |
| | 16 | - {{{$track_empty();}}} . . . . . . . . . . empties read/write sets currently used for tracking. |
| | 17 | - {{{$tracked_reads();}}} . . . . . . . . returns a set of tracked shared variables read by its caller process. |
| | 18 | - {{{$tracked_writes();}}} . . . . . . . returns a set of tracked shared variables written by its caller process. |
| | 19 | 5. {{{$check_data_race}}} asserts that: |
| | 20 | {{{ |
| | 21 | $forall (int i, j: 0 .. nthreads - 1) (i != j) ==> |
| | 22 | $mem_disjoint( |
| | 23 | writes[i], |
| | 24 | $mem_union(reads[j], writes[j]) |
| | 25 | ); |
| | 26 | }}} |
| 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 = 0; // Exit critical block |
| 51 | | } |
| 52 | | $check_data_race(); // 1st check |
| 53 | | } // RS stack: rs0; WS stack: ws0; empty sets rs1, ws1; |
| | 55 | $when(_omp_critical_c->value == 0); |
| | 56 | $track{ // Ignore race on lock |
| | 57 | _omp_critical_c->value = 1; // Enter critical block |
| | 58 | } |
| | 59 | B; |
| | 60 | $track{ // Ignore race on lock |
| | 61 | _omp_critical_c->value = 0; // Exit critical block |
| | 62 | } |
| | 63 | // RS stack: rs0:={A, B}; WS stack: ws0:={A, B}; |
| | 64 | $check_data_race(); // 1st check |
| | 65 | $track_clean(); |
| | 66 | // RS stack: rs0:={}; WS stack: ws0:={}; |