equal
deleted
inserted
replaced
21 * questions. |
21 * questions. |
22 */ |
22 */ |
23 |
23 |
24 #include "precompiled.hpp" |
24 #include "precompiled.hpp" |
25 #include "runtime/atomic.hpp" |
25 #include "runtime/atomic.hpp" |
26 #include "runtime/orderAccess.hpp" |
|
27 #include "runtime/os.hpp" |
26 #include "runtime/os.hpp" |
28 #include "utilities/globalCounter.hpp" |
27 #include "utilities/globalCounter.hpp" |
29 #include "utilities/globalCounter.inline.hpp" |
28 #include "utilities/globalCounter.inline.hpp" |
30 #include "threadHelper.inline.hpp" |
29 #include "threadHelper.inline.hpp" |
31 |
30 |
46 virtual ~RCUReaderThread(){} |
45 virtual ~RCUReaderThread(){} |
47 void main_run() { |
46 void main_run() { |
48 _wrt_start->signal(); |
47 _wrt_start->signal(); |
49 while (!_exit) { |
48 while (!_exit) { |
50 GlobalCounter::CSContext cs_context = GlobalCounter::critical_section_begin(this); |
49 GlobalCounter::CSContext cs_context = GlobalCounter::critical_section_begin(this); |
51 volatile TestData* test = OrderAccess::load_acquire(_test); |
50 volatile TestData* test = Atomic::load_acquire(_test); |
52 long value = OrderAccess::load_acquire(&test->test_value); |
51 long value = Atomic::load_acquire(&test->test_value); |
53 ASSERT_EQ(value, GOOD_VALUE); |
52 ASSERT_EQ(value, GOOD_VALUE); |
54 GlobalCounter::critical_section_end(this, cs_context); |
53 GlobalCounter::critical_section_end(this, cs_context); |
55 { |
54 { |
56 GlobalCounter::CriticalSection cs(this); |
55 GlobalCounter::CriticalSection cs(this); |
57 volatile TestData* test = OrderAccess::load_acquire(_test); |
56 volatile TestData* test = Atomic::load_acquire(_test); |
58 long value = OrderAccess::load_acquire(&test->test_value); |
57 long value = Atomic::load_acquire(&test->test_value); |
59 ASSERT_EQ(value, GOOD_VALUE); |
58 ASSERT_EQ(value, GOOD_VALUE); |
60 } |
59 } |
61 } |
60 } |
62 } |
61 } |
63 }; |
62 }; |
80 RCUReaderThread* reader3 = new RCUReaderThread(&post, &test, &wrt_start); |
79 RCUReaderThread* reader3 = new RCUReaderThread(&post, &test, &wrt_start); |
81 RCUReaderThread* reader4 = new RCUReaderThread(&post, &test, &wrt_start); |
80 RCUReaderThread* reader4 = new RCUReaderThread(&post, &test, &wrt_start); |
82 |
81 |
83 TestData* tmp = new TestData(); |
82 TestData* tmp = new TestData(); |
84 tmp->test_value = GOOD_VALUE; |
83 tmp->test_value = GOOD_VALUE; |
85 OrderAccess::release_store_fence(&test, tmp); |
84 Atomic::release_store_fence(&test, tmp); |
86 |
85 |
87 reader1->doit(); |
86 reader1->doit(); |
88 reader2->doit(); |
87 reader2->doit(); |
89 reader3->doit(); |
88 reader3->doit(); |
90 reader4->doit(); |
89 reader4->doit(); |
97 jlong stop_ms = os::javaTimeMillis() + 1000; // 1 seconds max test time |
96 jlong stop_ms = os::javaTimeMillis() + 1000; // 1 seconds max test time |
98 for (int i = 0; i < 100000 && stop_ms > os::javaTimeMillis(); i++) { |
97 for (int i = 0; i < 100000 && stop_ms > os::javaTimeMillis(); i++) { |
99 volatile TestData* free_tmp = test; |
98 volatile TestData* free_tmp = test; |
100 tmp = new TestData(); |
99 tmp = new TestData(); |
101 tmp->test_value = GOOD_VALUE; |
100 tmp->test_value = GOOD_VALUE; |
102 OrderAccess::release_store(&test, tmp); |
101 Atomic::release_store(&test, tmp); |
103 GlobalCounter::write_synchronize(); |
102 GlobalCounter::write_synchronize(); |
104 free_tmp->test_value = BAD_VALUE; |
103 free_tmp->test_value = BAD_VALUE; |
105 delete free_tmp; |
104 delete free_tmp; |
106 } |
105 } |
107 RCUReaderThread::_exit = true; |
106 RCUReaderThread::_exit = true; |