21 #define BOOST_TEST_MODULE libjmmcg_tests
22 #include <boost/test/included/unit_test.hpp>
24 #include <boost/mpl/list.hpp>
26 #include "core/thread_api_traits.hpp"
27 #include "core/thread_wrapper.hpp"
29 using namespace libjmmcg;
32 typedef boost::mpl::list<
33 api_lock_traits<platform_api, heavyweight_threading>::atomic_counter_type<
long>
36 template<
long exit_val,
class Ctr>
37 struct inc_thread
final :
public ppd::wrapper<ppd::platform_api, heavyweight_threading> {
46 base_t::wait_thread_exit();
50 for (
unsigned long j=0; j<exit_val; ++j) {
57 template<
long exit_val,
long Inc,
class Ctr>
58 struct inc_by_val_thread
final :
public ppd::wrapper<ppd::platform_api, heavyweight_threading> {
67 base_t::wait_thread_exit();
71 for (
unsigned long j=0; j<exit_val; ++j) {
78 template<
long exit_val,
class Ctr>
79 struct dec_thread
final :
public ppd::wrapper<ppd::platform_api, heavyweight_threading> {
88 this->wait_thread_exit();
92 for (
unsigned long j=0; j<exit_val; ++j) {
99 template<
long exit_val,
long Dec,
class Ctr>
100 struct dec_by_val_thread
final :
public ppd::wrapper<ppd::platform_api, heavyweight_threading> {
109 this->wait_thread_exit();
113 for (
unsigned long j=0; j<exit_val; ++j) {
120 BOOST_AUTO_TEST_SUITE(atomic_counter_parallel_tests)
122 BOOST_AUTO_TEST_CASE_TEMPLATE(parallel_increments, ctr_t, ctr_types) {
123 const unsigned int check_value=100;
124 typedef inc_thread<check_value, ctr_t> inc_t;
129 inc1.create_running();
130 inc2.create_running();
132 api_threading_traits<platform_api, heavyweight_threading>::sleep(100);
133 }
while (inc1.is_running() || inc2.is_running());
134 BOOST_CHECK_EQUAL(c.get(), 2*check_value);
137 BOOST_AUTO_TEST_CASE_TEMPLATE(parallel_decrements, ctr_t, ctr_types) {
138 const unsigned long check_value=100;
139 typedef dec_thread<check_value, ctr_t> dec_t;
141 ctr_t c(2*check_value);
144 dec1.create_running();
145 dec2.create_running();
147 api_threading_traits<platform_api, heavyweight_threading>::sleep(100);
148 }
while (dec1.is_running() || dec2.is_running());
149 BOOST_CHECK_EQUAL(c.get(), 0);
152 BOOST_AUTO_TEST_CASE_TEMPLATE(parallel_inc_and_dec, ctr_t, ctr_types) {
153 const unsigned long check_value=100;
154 typedef inc_thread<check_value, ctr_t> inc_t;
155 typedef dec_thread<check_value, ctr_t> dec_t;
157 ctr_t c(check_value);
160 inc.create_running();
161 dec.create_running();
163 api_threading_traits<platform_api, heavyweight_threading>::sleep(100);
164 }
while (inc.is_running() || dec.is_running());
165 BOOST_CHECK_EQUAL(c.get(), check_value);
168 BOOST_AUTO_TEST_CASE_TEMPLATE(parallel_inc_and_dec_by_val, ctr_t, ctr_types) {
169 const unsigned long check_value=100;
170 const unsigned long delta=2;
171 typedef inc_by_val_thread<check_value, delta, ctr_t> inc_t;
172 typedef dec_by_val_thread<check_value, delta, ctr_t> dec_t;
174 ctr_t c(delta*check_value);
177 inc.create_running();
178 dec.create_running();
180 api_threading_traits<platform_api, heavyweight_threading>::sleep(100);
181 }
while (inc.is_running() || dec.is_running());
182 BOOST_CHECK_EQUAL(c.get(), delta*check_value);
185 BOOST_AUTO_TEST_SUITE_END()