123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- // Copyright (C) 2007-8 Anthony Williams
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #define BOOST_THREAD_VERSION 2
- #define BOOST_TEST_MODULE Boost.Threads: condition_variable test suite
- #include <boost/thread/detail/config.hpp>
- #include <boost/thread/condition.hpp>
- #include <boost/thread/thread_only.hpp>
- #include <boost/test/unit_test.hpp>
- #include "./util.inl"
- bool fake_predicate()
- {
- return false;
- }
- unsigned const timeout_seconds=2;
- unsigned const timeout_grace=1;
- boost::posix_time::milliseconds const timeout_resolution(100);
- void do_test_timed_wait_times_out()
- {
- boost::condition_variable cond;
- boost::mutex m;
- boost::posix_time::seconds const delay(timeout_seconds);
- boost::unique_lock<boost::mutex> lock(m);
- boost::system_time const start=boost::get_system_time();
- boost::system_time const timeout=start+delay;
- while(cond.timed_wait(lock,timeout)) {}
- boost::system_time const end=boost::get_system_time();
- BOOST_CHECK((delay-timeout_resolution)<=(end-start));
- }
- void do_test_timed_wait_with_predicate_times_out()
- {
- boost::condition_variable cond;
- boost::mutex m;
- boost::posix_time::seconds const delay(timeout_seconds);
- boost::unique_lock<boost::mutex> lock(m);
- boost::system_time const start=boost::get_system_time();
- boost::system_time const timeout=start+delay;
- bool const res=cond.timed_wait(lock,timeout,fake_predicate);
- boost::system_time const end=boost::get_system_time();
- BOOST_CHECK(!res);
- BOOST_CHECK((delay-timeout_resolution)<=(end-start));
- }
- void do_test_relative_timed_wait_with_predicate_times_out()
- {
- boost::condition_variable cond;
- boost::mutex m;
- boost::posix_time::seconds const delay(timeout_seconds);
- boost::unique_lock<boost::mutex> lock(m);
- boost::system_time const start=boost::get_system_time();
- bool const res=cond.timed_wait(lock,delay,fake_predicate);
- boost::system_time const end=boost::get_system_time();
- BOOST_CHECK(!res);
- BOOST_CHECK((delay-timeout_resolution)<=(end-start));
- }
- void do_test_timed_wait_relative_times_out()
- {
- boost::condition_variable cond;
- boost::mutex m;
- boost::posix_time::seconds const delay(timeout_seconds);
- boost::unique_lock<boost::mutex> lock(m);
- boost::system_time const start=boost::get_system_time();
- while(cond.timed_wait(lock,delay)) {}
- boost::system_time const end=boost::get_system_time();
- BOOST_CHECK((delay-timeout_resolution)<=(end-start));
- }
- void do_test_cv_any_timed_wait_times_out()
- {
- boost::condition_variable_any cond;
- boost::mutex m;
- boost::posix_time::seconds const delay(timeout_seconds);
- boost::unique_lock<boost::mutex> lock(m);
- boost::system_time const start=boost::get_system_time();
- boost::system_time const timeout=start+delay;
- while(cond.timed_wait(lock,timeout)) {}
- boost::system_time const end=boost::get_system_time();
- BOOST_CHECK((delay-timeout_resolution)<=(end-start));
- }
- void do_test_cv_any_timed_wait_with_predicate_times_out()
- {
- boost::condition_variable_any cond;
- boost::mutex m;
- boost::posix_time::seconds const delay(timeout_seconds);
- boost::unique_lock<boost::mutex> lock(m);
- boost::system_time const start=boost::get_system_time();
- boost::system_time const timeout=start+delay;
- bool const res=cond.timed_wait(lock,timeout,fake_predicate);
- boost::system_time const end=boost::get_system_time();
- BOOST_CHECK(!res);
- BOOST_CHECK((delay-timeout_resolution)<=(end-start));
- }
- void do_test_cv_any_relative_timed_wait_with_predicate_times_out()
- {
- boost::condition_variable_any cond;
- boost::mutex m;
- boost::posix_time::seconds const delay(timeout_seconds);
- boost::unique_lock<boost::mutex> lock(m);
- boost::system_time const start=boost::get_system_time();
- bool const res=cond.timed_wait(lock,delay,fake_predicate);
- boost::system_time const end=boost::get_system_time();
- BOOST_CHECK(!res);
- BOOST_CHECK((delay-timeout_resolution)<=(end-start));
- }
- void do_test_cv_any_timed_wait_relative_times_out()
- {
- boost::condition_variable_any cond;
- boost::mutex m;
- boost::posix_time::seconds const delay(timeout_seconds);
- boost::unique_lock<boost::mutex> lock(m);
- boost::system_time const start=boost::get_system_time();
- while(cond.timed_wait(lock,delay)) {}
- boost::system_time const end=boost::get_system_time();
- BOOST_CHECK((delay-timeout_resolution)<=(end-start));
- }
- BOOST_AUTO_TEST_CASE(test_timed_wait_times_out)
- {
- timed_test(&do_test_timed_wait_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
- timed_test(&do_test_timed_wait_with_predicate_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
- timed_test(&do_test_relative_timed_wait_with_predicate_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
- timed_test(&do_test_timed_wait_relative_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
- timed_test(&do_test_cv_any_timed_wait_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
- timed_test(&do_test_cv_any_timed_wait_with_predicate_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
- timed_test(&do_test_cv_any_relative_timed_wait_with_predicate_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
- timed_test(&do_test_cv_any_timed_wait_relative_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
- }
|