/* TAGS: big */ /* VERIFY_OPTS: -o nofail:malloc */ /* CC_OPTS: -Dgmtime_r=gmtime -Dlocaltime_r=localtime -DBOOST_HAS_PTHREADS -DBOOST_THREAD_POSIX -DPOSIX_THREADS -D__linux -D_SC_PAGESIZE -I $BOOST/libs/thread/include/ -I test/termination -I $BOOST/libs/config/include/ -I $BOOST/libs/throw_exception/include -I $BOOST/libs/assert/include/ -I $BOOST/libs/core/include/ -I $BOOST/libs/system/include/ -I $BOOST/libs/type_traits/include/ -I $BOOST/libs/static_assert/include/ -I $BOOST/libs/move/include/ -I $BOOST/libs/date_time/include/ -I $BOOST/libs/smart_ptr/include/ -I $BOOST/libs/predef/include -I $BOOST/libs/utility/include/ -I $BOOST/libs/mpl/include/ -I$BOOST/libs/preprocessor/include/ -I $BOOST/libs/numeric/conversion/include/ -I $BOOST/libs/chrono/include/ -I $BOOST/libs/ratio/include/ -I $BOOST/libs/integer/include/ -I $BOOST/libs/bind/include/ -I $BOOST/libs/io/include/ -I $BOOST/libs/container_hash/include/ -I $BOOST/libs/detail/include/ -I $BOOST/libs/atomic/include/ -I $BOOST/libs/tuple/include/ -I $BOOST/libs/exception/include/ -I $BOOST/libs/iterator/include/ -I $BOOST/libs/optional/include/ -I $BOOST/libs/function/include/ -I $BOOST/libs/type_index/include/ -I $BOOST/libs/algorithm/include -I $BOOST/libs/range/include -I $BOOST/libs/concept_check/include/ -I $BOOST/libs/lexical_cast/include/ -I $BOOST/libs/array/include/ -I $BOOST/libs/container/include/ -I $BOOST/libs/math/include */ /* EXTRA_SRCS: $BOOST/libs/thread/src/pthread/thread.cpp $BOOST/libs/thread/src/pthread/once_atomic.cpp */ #include #include // V: ok.2@safety // V: ok.3.@safety CC_OPT: -DTHR3 // V: more.2@safety CC_OPT: -DWCNT=3 // V: more.3@safety CC_OPT: -DTHR3 -DWCNT=4 // V: less.2@safety CC_OPT: -DWCNT=1 ERR: error trace: Assertion // V: less.3@safety CC_OPT: -DTHR3 -DWCNT=2 ERR: error trace: Assertion // V: ok.2@local V_OPT: --nontermination local // V: ok.3.@local CC_OPT: -DTHR3 V_OPT: --nontermination local // V: more.2@local CC_OPT: -DWCNT=3 ERR: error trace: termsec check V_OPT: --nontermination local // V: more.3@local CC_OPT: -DTHR3 -DWCNT=4 ERR: error trace: termsec check V_OPT: --nontermination local // V: less.2@local CC_OPT: -DWCNT=1 ERR: error trace: Assertion V_OPT: --nontermination local // V: less.3@local CC_OPT: -DTHR3 -DWCNT=2 ERR: error trace: Assertion V_OPT: --nontermination local // V: ok.2@global V_OPT: --nontermination global // V: ok.3.@global CC_OPT: -DTHR3 V_OPT: --nontermination global // V: more.2@global CC_OPT: -DWCNT=3 ERR: error trace: .* V_OPT: --nontermination global // V: more.3@global CC_OPT: -DTHR3 -DWCNT=4 ERR: error trace: .* V_OPT: --nontermination global // V: less.2@global CC_OPT: -DWCNT=1 ERR: error trace: Assertion V_OPT: --nontermination global // V: less.3@global CC_OPT: -DTHR3 -DWCNT=2 ERR: error trace: Assertion V_OPT: --nontermination global #ifdef WCNT const int wait_count = WCNT; #elif THR3 const int wait_count = 3; #else const int wait_count = 2; #endif #ifdef CCNT const int check_count = CCNT; #elif THR3 const int check_count = 3; #else const int check_count = 2; #endif int main() { boost::barrier bar{ wait_count }; std::atomic< int > cnt{ 0 }; std::thread ta( [&] { ++cnt; bar.wait(); assert( cnt == check_count ); } ); #ifdef THR3 std::thread tb( [&] { ++cnt; bar.wait(); assert( cnt == check_count ); } ); #endif ++cnt; bar.wait(); assert( cnt == check_count ); ta.join(); #ifdef THR3 tb.join(); #endif }