test/hotspot/gtest/utilities/test_globalCounter.cpp
changeset 59247 56bf71d64d51
parent 52332 d2a3503c72f7
equal deleted inserted replaced
59246:fcad92f425c5 59247:56bf71d64d51
    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;