test_condition_timed_wait_times_out.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169
  1. // Copyright (C) 2007-8 Anthony Williams
  2. //
  3. // Distributed under the Boost Software License, Version 1.0. (See accompanying
  4. // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
  5. #define BOOST_THREAD_VERSION 2
  6. #define BOOST_TEST_MODULE Boost.Threads: condition_variable test suite
  7. #include <boost/thread/detail/config.hpp>
  8. #include <boost/thread/condition.hpp>
  9. #include <boost/thread/thread_only.hpp>
  10. #include <boost/test/unit_test.hpp>
  11. #include "./util.inl"
  12. bool fake_predicate()
  13. {
  14. return false;
  15. }
  16. unsigned const timeout_seconds=2;
  17. unsigned const timeout_grace=1;
  18. boost::posix_time::milliseconds const timeout_resolution(100);
  19. void do_test_timed_wait_times_out()
  20. {
  21. boost::condition_variable cond;
  22. boost::mutex m;
  23. boost::posix_time::seconds const delay(timeout_seconds);
  24. boost::unique_lock<boost::mutex> lock(m);
  25. boost::system_time const start=boost::get_system_time();
  26. boost::system_time const timeout=start+delay;
  27. while(cond.timed_wait(lock,timeout)) {}
  28. boost::system_time const end=boost::get_system_time();
  29. BOOST_CHECK((delay-timeout_resolution)<=(end-start));
  30. }
  31. void do_test_timed_wait_with_predicate_times_out()
  32. {
  33. boost::condition_variable cond;
  34. boost::mutex m;
  35. boost::posix_time::seconds const delay(timeout_seconds);
  36. boost::unique_lock<boost::mutex> lock(m);
  37. boost::system_time const start=boost::get_system_time();
  38. boost::system_time const timeout=start+delay;
  39. bool const res=cond.timed_wait(lock,timeout,fake_predicate);
  40. boost::system_time const end=boost::get_system_time();
  41. BOOST_CHECK(!res);
  42. BOOST_CHECK((delay-timeout_resolution)<=(end-start));
  43. }
  44. void do_test_relative_timed_wait_with_predicate_times_out()
  45. {
  46. boost::condition_variable cond;
  47. boost::mutex m;
  48. boost::posix_time::seconds const delay(timeout_seconds);
  49. boost::unique_lock<boost::mutex> lock(m);
  50. boost::system_time const start=boost::get_system_time();
  51. bool const res=cond.timed_wait(lock,delay,fake_predicate);
  52. boost::system_time const end=boost::get_system_time();
  53. BOOST_CHECK(!res);
  54. BOOST_CHECK((delay-timeout_resolution)<=(end-start));
  55. }
  56. void do_test_timed_wait_relative_times_out()
  57. {
  58. boost::condition_variable cond;
  59. boost::mutex m;
  60. boost::posix_time::seconds const delay(timeout_seconds);
  61. boost::unique_lock<boost::mutex> lock(m);
  62. boost::system_time const start=boost::get_system_time();
  63. while(cond.timed_wait(lock,delay)) {}
  64. boost::system_time const end=boost::get_system_time();
  65. BOOST_CHECK((delay-timeout_resolution)<=(end-start));
  66. }
  67. void do_test_cv_any_timed_wait_times_out()
  68. {
  69. boost::condition_variable_any cond;
  70. boost::mutex m;
  71. boost::posix_time::seconds const delay(timeout_seconds);
  72. boost::unique_lock<boost::mutex> lock(m);
  73. boost::system_time const start=boost::get_system_time();
  74. boost::system_time const timeout=start+delay;
  75. while(cond.timed_wait(lock,timeout)) {}
  76. boost::system_time const end=boost::get_system_time();
  77. BOOST_CHECK((delay-timeout_resolution)<=(end-start));
  78. }
  79. void do_test_cv_any_timed_wait_with_predicate_times_out()
  80. {
  81. boost::condition_variable_any cond;
  82. boost::mutex m;
  83. boost::posix_time::seconds const delay(timeout_seconds);
  84. boost::unique_lock<boost::mutex> lock(m);
  85. boost::system_time const start=boost::get_system_time();
  86. boost::system_time const timeout=start+delay;
  87. bool const res=cond.timed_wait(lock,timeout,fake_predicate);
  88. boost::system_time const end=boost::get_system_time();
  89. BOOST_CHECK(!res);
  90. BOOST_CHECK((delay-timeout_resolution)<=(end-start));
  91. }
  92. void do_test_cv_any_relative_timed_wait_with_predicate_times_out()
  93. {
  94. boost::condition_variable_any cond;
  95. boost::mutex m;
  96. boost::posix_time::seconds const delay(timeout_seconds);
  97. boost::unique_lock<boost::mutex> lock(m);
  98. boost::system_time const start=boost::get_system_time();
  99. bool const res=cond.timed_wait(lock,delay,fake_predicate);
  100. boost::system_time const end=boost::get_system_time();
  101. BOOST_CHECK(!res);
  102. BOOST_CHECK((delay-timeout_resolution)<=(end-start));
  103. }
  104. void do_test_cv_any_timed_wait_relative_times_out()
  105. {
  106. boost::condition_variable_any cond;
  107. boost::mutex m;
  108. boost::posix_time::seconds const delay(timeout_seconds);
  109. boost::unique_lock<boost::mutex> lock(m);
  110. boost::system_time const start=boost::get_system_time();
  111. while(cond.timed_wait(lock,delay)) {}
  112. boost::system_time const end=boost::get_system_time();
  113. BOOST_CHECK((delay-timeout_resolution)<=(end-start));
  114. }
  115. BOOST_AUTO_TEST_CASE(test_timed_wait_times_out)
  116. {
  117. timed_test(&do_test_timed_wait_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
  118. timed_test(&do_test_timed_wait_with_predicate_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
  119. timed_test(&do_test_relative_timed_wait_with_predicate_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
  120. timed_test(&do_test_timed_wait_relative_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
  121. timed_test(&do_test_cv_any_timed_wait_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
  122. timed_test(&do_test_cv_any_timed_wait_with_predicate_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
  123. timed_test(&do_test_cv_any_relative_timed_wait_with_predicate_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
  124. timed_test(&do_test_cv_any_timed_wait_relative_times_out, timeout_seconds+timeout_grace, execution_monitor::use_mutex);
  125. }