From d5cf20212b5d2dffef258305209e971fb1ecc1ce Mon Sep 17 00:00:00 2001 From: Benjamin Kosnik Date: Fri, 13 Feb 2009 00:14:42 +0000 Subject: [PATCH] all.h (compare_type_to_native_type_sizes): To... 2009-02-12 Benjamin Kosnik * testsuite/util/thread/all.h (compare_type_to_native_type_sizes): To... (compare_type_to_native_type): ...this, add alignment check. * testsuite/30_threads/condition_variable_any/native_handle/ typesizes.cc: Modify as above. * testsuite/30_threads/mutex/native_handle/typesizes.cc: Same. * testsuite/30_threads/timed_mutex/native_handle/typesizes.cc: Same. * testsuite/30_threads/thread/native_handle/typesizes.cc: Same. * testsuite/30_threads/recursive_mutex/native_handle/typesizes.cc: Same. * testsuite/30_threads/condition_variable/native_handle/ typesizes.cc: Same. * testsuite/30_threads/recursive_timed_mutex/native_handle/ typesizes.cc: Same. * testsuite/30_threads/thread/cons/1.cc: Add comments. * testsuite/30_threads/thread/cons/2.cc: Same. * testsuite/30_threads/thread/cons/3.cc: Same. * testsuite/30_threads/thread/cons/4.cc: Same. * testsuite/30_threads/thread/cons/5.cc: Same. * testsuite/30_threads/thread/cons/6.cc: Same. * testsuite/30_threads/thread/cons/7.cc: Same. * testsuite/30_threads/thread/cons/8.cc: Same. * testsuite/30_threads/thread/cons/9.cc: New. * testsuite/30_threads/thread/cons/moveable.cc: New. * src/condition_variable.cc: Clean up whitespace. * include/std/condition_variable: Same. From-SVN: r144142 --- libstdc++-v3/ChangeLog | 30 +++++++++ libstdc++-v3/include/std/condition_variable | 72 +++++++++++----------- libstdc++-v3/src/condition_variable.cc | 16 ++--- .../condition_variable/native_handle/typesizes.cc | 2 +- .../native_handle/typesizes.cc | 2 +- .../30_threads/mutex/native_handle/typesizes.cc | 2 +- .../recursive_mutex/native_handle/typesizes.cc | 2 +- .../native_handle/typesizes.cc | 2 +- libstdc++-v3/testsuite/30_threads/thread/cons/1.cc | 3 + libstdc++-v3/testsuite/30_threads/thread/cons/2.cc | 24 +++++--- libstdc++-v3/testsuite/30_threads/thread/cons/3.cc | 9 ++- libstdc++-v3/testsuite/30_threads/thread/cons/4.cc | 11 +++- libstdc++-v3/testsuite/30_threads/thread/cons/5.cc | 3 +- libstdc++-v3/testsuite/30_threads/thread/cons/6.cc | 4 ++ libstdc++-v3/testsuite/30_threads/thread/cons/7.cc | 5 +- libstdc++-v3/testsuite/30_threads/thread/cons/8.cc | 5 +- .../30_threads/thread/native_handle/typesizes.cc | 4 +- .../timed_mutex/native_handle/typesizes.cc | 2 +- libstdc++-v3/testsuite/util/thread/all.h | 19 +++--- 19 files changed, 138 insertions(+), 79 deletions(-) diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index b04ae7d..c60b452 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,33 @@ +2009-02-12 Benjamin Kosnik + + * testsuite/util/thread/all.h (compare_type_to_native_type_sizes): To... + (compare_type_to_native_type): ...this, add alignment check. + * testsuite/30_threads/condition_variable_any/native_handle/ + typesizes.cc: Modify as above. + * testsuite/30_threads/mutex/native_handle/typesizes.cc: Same. + * testsuite/30_threads/timed_mutex/native_handle/typesizes.cc: Same. + * testsuite/30_threads/thread/native_handle/typesizes.cc: Same. + * testsuite/30_threads/recursive_mutex/native_handle/typesizes.cc: Same. + * testsuite/30_threads/condition_variable/native_handle/ + typesizes.cc: Same. + * testsuite/30_threads/recursive_timed_mutex/native_handle/ + typesizes.cc: Same. + + * testsuite/30_threads/thread/cons/1.cc: Add comments. + * testsuite/30_threads/thread/cons/2.cc: Same. + * testsuite/30_threads/thread/cons/3.cc: Same. + * testsuite/30_threads/thread/cons/4.cc: Same. + * testsuite/30_threads/thread/cons/5.cc: Same. + * testsuite/30_threads/thread/cons/6.cc: Same. + * testsuite/30_threads/thread/cons/7.cc: Same. + * testsuite/30_threads/thread/cons/8.cc: Same. + + * testsuite/30_threads/thread/cons/9.cc: New. + * testsuite/30_threads/thread/cons/moveable.cc: New. + + * src/condition_variable.cc: Clean up whitespace. + * include/std/condition_variable: Same. + 2009-02-09 Benjamin Kosnik * include/std/condition_variable (condition_variable): Remove diff --git a/libstdc++-v3/include/std/condition_variable b/libstdc++-v3/include/std/condition_variable index 0c28b18..c26c213 100644 --- a/libstdc++-v3/include/std/condition_variable +++ b/libstdc++-v3/include/std/condition_variable @@ -45,7 +45,7 @@ #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) -namespace std +namespace std { /// condition_variable class condition_variable @@ -63,25 +63,25 @@ namespace std condition_variable(const condition_variable&) = delete; condition_variable& operator=(const condition_variable&) = delete; - void + void notify_one(); - void + void notify_all(); - void + void wait(unique_lock& __lock); template - void + void wait(unique_lock& __lock, _Predicate __p) { while (!__p()) wait(__lock); } - + template - bool + bool wait_until(unique_lock& __lock, const chrono::time_point<__clock_t, _Duration>& __atime) { return __wait_until_impl(__lock, __atime); } @@ -94,7 +94,7 @@ namespace std // DR 887 - Sync unknown clock to known clock. typename _Clock::time_point __c_entry = _Clock::now(); __clock_t::time_point __s_entry = __clock_t::now(); - chrono::nanoseconds __delta = __atime - __c_entry; + chrono::nanoseconds __delta = __atime - __c_entry; __clock_t::time_point __s_atime = __s_entry + __delta; return __wait_until_impl(__lock, __s_atime); @@ -109,7 +109,7 @@ namespace std while (!__p()) if (!wait_until(__lock, __atime)) return __p(); - + return true; } @@ -126,8 +126,8 @@ namespace std _Predicate __p) { return wait_until(__lock, __clock_t::now() + __rtime, std::move(__p)); } - native_handle_type - native_handle() + native_handle_type + native_handle() { return &_M_cond; } private: @@ -137,21 +137,21 @@ namespace std const chrono::time_point<_Clock, _Duration>& __atime) { chrono::time_point<__clock_t, chrono::seconds> __s = - chrono::time_point_cast(__atime); - + chrono::time_point_cast(__atime); + chrono::nanoseconds __ns = - chrono::duration_cast(__atime - __s); - - __gthread_time_t __ts = - { - static_cast(__s.time_since_epoch().count()), - static_cast(__ns.count()) - }; - - __gthread_cond_timedwait(&_M_cond, __lock.mutex()->native_handle(), - &__ts); - - return _Clock::now() < __atime; + chrono::duration_cast(__atime - __s); + + __gthread_time_t __ts = + { + static_cast(__s.time_since_epoch().count()), + static_cast(__ns.count()) + }; + + __gthread_cond_timedwait(&_M_cond, __lock.mutex()->native_handle(), + &__ts); + + return _Clock::now() < __atime; } }; @@ -167,36 +167,36 @@ namespace std condition_variable_any(); ~condition_variable_any(); - + condition_variable_any(const condition_variable_any&) = delete; condition_variable_any& operator=(const condition_variable_any&) = delete; - void + void notify_one(); - void + void notify_all(); template - void + void wait(_Lock& __lock); template - void + void wait(_Lock& __lock, _Predicate __p); template - bool + bool wait_until(_Lock& __lock, const chrono::time_point<_Clock, _Duration>& __atime); - template - bool + bool wait_until(_Lock& __lock, const chrono::time_point<_Clock, _Duration>& __atime, _Predicate __p); - + template bool wait_for(_Lock& __lock, const chrono::duration<_Rep, _Period>& __rtime); @@ -204,10 +204,10 @@ namespace std template bool - wait_for(_Lock& __lock, + wait_for(_Lock& __lock, const chrono::duration<_Rep, _Period>& __rtime, _Predicate __p); - native_handle_type + native_handle_type native_handle() { return &_M_cond; } }; diff --git a/libstdc++-v3/src/condition_variable.cc b/libstdc++-v3/src/condition_variable.cc index c916bf0..c36881b 100644 --- a/libstdc++-v3/src/condition_variable.cc +++ b/libstdc++-v3/src/condition_variable.cc @@ -59,12 +59,12 @@ namespace std int __e = __gthread_cond_wait(&_M_cond, __lock.mutex()->native_handle()); if (__e) - __throw_system_error(__e); + __throw_system_error(__e); } - - void + + void condition_variable::notify_one() - { + { int __e = __gthread_cond_signal(&_M_cond); // XXX not in spec @@ -73,9 +73,9 @@ namespace std __throw_system_error(__e); } - void + void condition_variable::notify_all() - { + { int __e = __gthread_cond_broadcast(&_M_cond); // XXX not in spec @@ -96,11 +96,11 @@ namespace std __throw_system_error(__e); #endif } - + condition_variable_any::~condition_variable_any() { __gthread_cond_destroy(&_M_cond); - } + } } #endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1 diff --git a/libstdc++-v3/testsuite/30_threads/condition_variable/native_handle/typesizes.cc b/libstdc++-v3/testsuite/30_threads/condition_variable/native_handle/typesizes.cc index 2dbaccc..9396879 100644 --- a/libstdc++-v3/testsuite/30_threads/condition_variable/native_handle/typesizes.cc +++ b/libstdc++-v3/testsuite/30_threads/condition_variable/native_handle/typesizes.cc @@ -29,6 +29,6 @@ int main() { typedef std::condition_variable test_type; - __gnu_test::compare_type_to_native_type_sizes(); + __gnu_test::compare_type_to_native_type(); return 0; } diff --git a/libstdc++-v3/testsuite/30_threads/condition_variable_any/native_handle/typesizes.cc b/libstdc++-v3/testsuite/30_threads/condition_variable_any/native_handle/typesizes.cc index 9d38896..2544291 100644 --- a/libstdc++-v3/testsuite/30_threads/condition_variable_any/native_handle/typesizes.cc +++ b/libstdc++-v3/testsuite/30_threads/condition_variable_any/native_handle/typesizes.cc @@ -29,6 +29,6 @@ int main() { typedef std::condition_variable_any test_type; - __gnu_test::compare_type_to_native_type_sizes(); + __gnu_test::compare_type_to_native_type(); return 0; } diff --git a/libstdc++-v3/testsuite/30_threads/mutex/native_handle/typesizes.cc b/libstdc++-v3/testsuite/30_threads/mutex/native_handle/typesizes.cc index b293008..cda0816 100644 --- a/libstdc++-v3/testsuite/30_threads/mutex/native_handle/typesizes.cc +++ b/libstdc++-v3/testsuite/30_threads/mutex/native_handle/typesizes.cc @@ -29,6 +29,6 @@ int main() { typedef std::mutex test_type; - __gnu_test::compare_type_to_native_type_sizes(); + __gnu_test::compare_type_to_native_type(); return 0; } diff --git a/libstdc++-v3/testsuite/30_threads/recursive_mutex/native_handle/typesizes.cc b/libstdc++-v3/testsuite/30_threads/recursive_mutex/native_handle/typesizes.cc index 6d58c1e..8ee1f38 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_mutex/native_handle/typesizes.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_mutex/native_handle/typesizes.cc @@ -29,6 +29,6 @@ int main() { typedef std::recursive_mutex test_type; - __gnu_test::compare_type_to_native_type_sizes(); + __gnu_test::compare_type_to_native_type(); return 0; } diff --git a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/native_handle/typesizes.cc b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/native_handle/typesizes.cc index b51bdf2..be9dc53 100644 --- a/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/native_handle/typesizes.cc +++ b/libstdc++-v3/testsuite/30_threads/recursive_timed_mutex/native_handle/typesizes.cc @@ -29,6 +29,6 @@ int main() { typedef std::recursive_timed_mutex test_type; - __gnu_test::compare_type_to_native_type_sizes(); + __gnu_test::compare_type_to_native_type(); return 0; } diff --git a/libstdc++-v3/testsuite/30_threads/thread/cons/1.cc b/libstdc++-v3/testsuite/30_threads/thread/cons/1.cc index a631e7e..9f5d83f 100644 --- a/libstdc++-v3/testsuite/30_threads/thread/cons/1.cc +++ b/libstdc++-v3/testsuite/30_threads/thread/cons/1.cc @@ -36,6 +36,9 @@ #include #include +// thread default cons works +// thread default cons no throw +// thread default cons not joinable int main() { bool test __attribute__((unused)) = true; diff --git a/libstdc++-v3/testsuite/30_threads/thread/cons/2.cc b/libstdc++-v3/testsuite/30_threads/thread/cons/2.cc index e53b088..aeccf79 100644 --- a/libstdc++-v3/testsuite/30_threads/thread/cons/2.cc +++ b/libstdc++-v3/testsuite/30_threads/thread/cons/2.cc @@ -32,7 +32,7 @@ // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. -#include // std::ref +#include // std::ref #include #include #include @@ -43,19 +43,27 @@ free_function(std::thread::id& id) id = std::this_thread::get_id(); } +// thread::id default cons +// thread::id copy ctor +// thread variadic cons, c++ function +// thread variadic cons joinable +// thread join +// thread join postcondition not joinable +// thread join postcondition function called correctly +// this_thread::get_id void test02() { bool test __attribute__((unused)) = true; try { - std::thread::id t1_id1; - std::thread t1(free_function, std::ref(t1_id1)); - std::thread::id t1_id2 = t1.get_id(); - VERIFY( t1.joinable() ); - t1.join(); - VERIFY( !t1.joinable() ); - VERIFY( t1_id1 == t1_id2 ); + std::thread::id id1; + std::thread t(free_function, std::ref(id1)); + std::thread::id id2 = t.get_id(); + VERIFY( t.joinable() ); + t.join(); + VERIFY( !t.joinable() ); + VERIFY( id1 == id2 ); } catch (const std::system_error&) { diff --git a/libstdc++-v3/testsuite/30_threads/thread/cons/3.cc b/libstdc++-v3/testsuite/30_threads/thread/cons/3.cc index 3df7ad0..54526c6 100644 --- a/libstdc++-v3/testsuite/30_threads/thread/cons/3.cc +++ b/libstdc++-v3/testsuite/30_threads/thread/cons/3.cc @@ -5,7 +5,7 @@ // { dg-require-cstdint "" } // { dg-require-gthreads "" } -// Copyright (C) 2008 Free Software Foundation, Inc. +// Copyright (C) 2008, 2009 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -32,8 +32,7 @@ // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. -#include // std::unary_function -#include // std::ref +#include // std::unary_function, std::ref #include #include #include @@ -55,6 +54,10 @@ struct copyable : public std::unary_function int copyable::copy_count = 0; +// same as 2, but function is copyable function object +// thread variadic cons not copied when std::ref +// thread variadic cons copied when not std::ref +// no errors void test03() { bool test __attribute__((unused)) = true; diff --git a/libstdc++-v3/testsuite/30_threads/thread/cons/4.cc b/libstdc++-v3/testsuite/30_threads/thread/cons/4.cc index 76fc9ec..5fdc8c0 100644 --- a/libstdc++-v3/testsuite/30_threads/thread/cons/4.cc +++ b/libstdc++-v3/testsuite/30_threads/thread/cons/4.cc @@ -5,7 +5,7 @@ // { dg-require-cstdint "" } // { dg-require-gthreads "" } -// Copyright (C) 2008 Free Software Foundation, Inc. +// Copyright (C) 2008, 2009 Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free // software; you can redistribute it and/or modify it under the @@ -32,8 +32,7 @@ // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. -#include // std::unary_function -#include // std::ref, std::cref +#include // std::unary_function, std::ref, std::cref #include #include #include @@ -50,6 +49,12 @@ struct noncopyable : std::unary_function } }; +// same as 3, but function is noncopyable function object +// thread variadic cons not copied when std::ref +// thread variadic cons copied when not std::ref +// thread variadic cons not copied when std::cref +// thread variadic cons copied when not std::cref +// no errors void test03() { bool test __attribute__((unused)) = true; diff --git a/libstdc++-v3/testsuite/30_threads/thread/cons/5.cc b/libstdc++-v3/testsuite/30_threads/thread/cons/5.cc index 35ea25a..6250c19 100644 --- a/libstdc++-v3/testsuite/30_threads/thread/cons/5.cc +++ b/libstdc++-v3/testsuite/30_threads/thread/cons/5.cc @@ -32,8 +32,7 @@ // invalidate any other reasons why the executable file might be covered by // the GNU General Public License. -#include // std::unary_function -#include // std::ref +#include // std::unary_function, std::ref #include #include #include diff --git a/libstdc++-v3/testsuite/30_threads/thread/cons/6.cc b/libstdc++-v3/testsuite/30_threads/thread/cons/6.cc index 0a6d747..367d0f6 100644 --- a/libstdc++-v3/testsuite/30_threads/thread/cons/6.cc +++ b/libstdc++-v3/testsuite/30_threads/thread/cons/6.cc @@ -43,6 +43,10 @@ void f() f_was_called = true; } +// thread non-variadic cons, c++ function +// thread join +// thread join postcondition function called correctly +// no errors void test06() { bool test __attribute__((unused)) = true; diff --git a/libstdc++-v3/testsuite/30_threads/thread/cons/7.cc b/libstdc++-v3/testsuite/30_threads/thread/cons/7.cc index fafa72a..62690de 100644 --- a/libstdc++-v3/testsuite/30_threads/thread/cons/7.cc +++ b/libstdc++-v3/testsuite/30_threads/thread/cons/7.cc @@ -51,6 +51,7 @@ struct copyable } }; +// same as 6, but function is copyable function object passed by reference void test07() { bool test __attribute__((unused)) = true; @@ -59,8 +60,8 @@ void test07() { copyable c; copyable& rc = c; - std::thread t1(rc); - t1.join(); + std::thread t(rc); + t.join(); VERIFY( functor_was_called ); } catch (const std::system_error&) diff --git a/libstdc++-v3/testsuite/30_threads/thread/cons/8.cc b/libstdc++-v3/testsuite/30_threads/thread/cons/8.cc index 8c6b2e1..de8fb87 100644 --- a/libstdc++-v3/testsuite/30_threads/thread/cons/8.cc +++ b/libstdc++-v3/testsuite/30_threads/thread/cons/8.cc @@ -52,6 +52,7 @@ struct moveable } }; +// same as 6, but function object is movable void test08() { bool test __attribute__((unused)) = true; @@ -59,8 +60,8 @@ void test08() try { moveable m; - std::thread t1(std::move(m)); - t1.join(); + std::thread t(std::move(m)); + t.join(); VERIFY( functor_was_called ); } catch (const std::system_error&) diff --git a/libstdc++-v3/testsuite/30_threads/thread/native_handle/typesizes.cc b/libstdc++-v3/testsuite/30_threads/thread/native_handle/typesizes.cc index b1103d95..2af81fb 100644 --- a/libstdc++-v3/testsuite/30_threads/thread/native_handle/typesizes.cc +++ b/libstdc++-v3/testsuite/30_threads/thread/native_handle/typesizes.cc @@ -29,7 +29,7 @@ int main() { typedef std::thread test_type; - // XXX disable at the moment - //__gnu_test::compare_type_to_native_type_sizes(); + // XX disable for now + //__gnu_test::compare_type_to_native_type(); return 0; } diff --git a/libstdc++-v3/testsuite/30_threads/timed_mutex/native_handle/typesizes.cc b/libstdc++-v3/testsuite/30_threads/timed_mutex/native_handle/typesizes.cc index 7a59d7d..e9debe5 100644 --- a/libstdc++-v3/testsuite/30_threads/timed_mutex/native_handle/typesizes.cc +++ b/libstdc++-v3/testsuite/30_threads/timed_mutex/native_handle/typesizes.cc @@ -29,6 +29,6 @@ int main() { typedef std::timed_mutex test_type; - __gnu_test::compare_type_to_native_type_sizes(); + __gnu_test::compare_type_to_native_type(); return 0; } diff --git a/libstdc++-v3/testsuite/util/thread/all.h b/libstdc++-v3/testsuite/util/thread/all.h index 39dea5f..4000272 100644 --- a/libstdc++-v3/testsuite/util/thread/all.h +++ b/libstdc++-v3/testsuite/util/thread/all.h @@ -39,24 +39,29 @@ namespace __gnu_test { // Assume _Tp::native_handle_type. + // Check C++ to native_handle_type characteristics: size and alignment. template void - compare_type_to_native_type_sizes() + compare_type_to_native_type() { typedef _Tp test_type; - typedef typename test_type::native_handle_type native_handle_type; - - int st = sizeof(test_type); // Remove possible pointer type. - int snt = sizeof(typename std::remove_pointer::type); - - if (st != snt) + typedef typename test_type::native_handle_type native_handle; + typedef typename std::remove_pointer::type native_type; + + int st = sizeof(test_type); + int snt = sizeof(native_type); + int at = __alignof__(test_type); + int ant = __alignof__(native_type); + if (st != snt || at != ant) { std::ostringstream s; s << std::endl; s << "size of _Tp: " << st << std::endl; + s << "alignment of _Tp: " << st << std::endl; s << "size of *(_Tp::native_handle_type): " << snt << std::endl; + s << "alignment of *(_Tp::native_handle_type): " << snt << std::endl; throw std::runtime_error(s.str()); } } -- 2.7.4