22 */ |
22 */ |
23 |
23 |
24 #include "precompiled.hpp" |
24 #include "precompiled.hpp" |
25 #include "metaprogramming/isRegisteredEnum.hpp" |
25 #include "metaprogramming/isRegisteredEnum.hpp" |
26 #include "runtime/atomic.hpp" |
26 #include "runtime/atomic.hpp" |
27 #include "runtime/orderAccess.hpp" |
|
28 #include "runtime/os.hpp" |
27 #include "runtime/os.hpp" |
29 #include "utilities/globalCounter.hpp" |
28 #include "utilities/globalCounter.hpp" |
30 #include "utilities/globalCounter.inline.hpp" |
29 #include "utilities/globalCounter.inline.hpp" |
31 #include "utilities/spinYield.hpp" |
30 #include "utilities/spinYield.hpp" |
32 #include "threadHelper.inline.hpp" |
31 #include "threadHelper.inline.hpp" |
55 {} |
54 {} |
56 |
55 |
57 ~RCUNestedThread() {} |
56 ~RCUNestedThread() {} |
58 |
57 |
59 void set_state(NestedTestState new_state) { |
58 void set_state(NestedTestState new_state) { |
60 OrderAccess::release_store(&_state, new_state); |
59 Atomic::release_store(&_state, new_state); |
61 } |
60 } |
62 |
61 |
63 void wait_with_state(NestedTestState new_state) { |
62 void wait_with_state(NestedTestState new_state) { |
64 SpinYield spinner; |
63 SpinYield spinner; |
65 OrderAccess::release_store(&_state, new_state); |
64 Atomic::release_store(&_state, new_state); |
66 while (!OrderAccess::load_acquire(&_proceed)) { |
65 while (!Atomic::load_acquire(&_proceed)) { |
67 spinner.wait(); |
66 spinner.wait(); |
68 } |
67 } |
69 OrderAccess::release_store(&_proceed, false); |
68 Atomic::release_store(&_proceed, false); |
70 } |
69 } |
71 |
70 |
72 public: |
71 public: |
73 NestedTestState state() const { |
72 NestedTestState state() const { |
74 return OrderAccess::load_acquire(&_state); |
73 return Atomic::load_acquire(&_state); |
75 } |
74 } |
76 |
75 |
77 void wait_for_state(NestedTestState goal) { |
76 void wait_for_state(NestedTestState goal) { |
78 SpinYield spinner; |
77 SpinYield spinner; |
79 while (state() != goal) { |
78 while (state() != goal) { |
80 spinner.wait(); |
79 spinner.wait(); |
81 } |
80 } |
82 } |
81 } |
83 |
82 |
84 void proceed() { |
83 void proceed() { |
85 OrderAccess::release_store(&_proceed, true); |
84 Atomic::release_store(&_proceed, true); |
86 } |
85 } |
87 }; |
86 }; |
88 |
87 |
89 class RCUNestedReaderThread : public RCUNestedThread { |
88 class RCUNestedReaderThread : public RCUNestedThread { |
90 public: |
89 public: |