Free memory
[c11tester.git] / impatomic.cc
1 #include "impatomic.h"
2 #include "common.h"
3 #include "model.h"
4 #include "threads-model.h"
5 #include "action.h"
6
7 namespace std {
8
9 bool atomic_flag_test_and_set_explicit ( volatile atomic_flag * __a__, memory_order __x__ ) {
10         volatile bool * __p__ = &((__a__)->__f__);
11         bool result = (bool) model->switch_to_master(new ModelAction(ATOMIC_RMWR, __x__, (void *) __p__));
12         model->switch_to_master(new ModelAction(ATOMIC_RMW, __x__, (void *) __p__, true));
13         return result;
14 }
15
16 bool atomic_flag_test_and_set( volatile atomic_flag* __a__ )
17 { return atomic_flag_test_and_set_explicit( __a__, memory_order_seq_cst ); }
18
19 void atomic_flag_clear_explicit
20         ( volatile atomic_flag* __a__, memory_order __x__ )
21 {
22         volatile bool * __p__ = &((__a__)->__f__);
23         model->switch_to_master(new ModelAction(ATOMIC_WRITE, __x__, (void *) __p__, false));
24 }
25
26 void atomic_flag_clear( volatile atomic_flag* __a__ )
27 { atomic_flag_clear_explicit( __a__, memory_order_seq_cst ); }
28
29 void __atomic_flag_wait__( volatile atomic_flag* __a__ ) {
30         while ( atomic_flag_test_and_set( __a__ ) )
31                 ;
32 }
33
34 void __atomic_flag_wait_explicit__( volatile atomic_flag* __a__,
35                                                                                                                                                 memory_order __x__ ) {
36         while ( atomic_flag_test_and_set_explicit( __a__, __x__ ))
37                 ;
38 }
39
40 }