Commit d5cf2021 by Benjamin Kosnik Committed by Benjamin Kosnik

all.h (compare_type_to_native_type_sizes): To...

2009-02-12  Benjamin Kosnik  <bkoz@redhat.com>

	* 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
parent ed7284dd
2009-02-12 Benjamin Kosnik <bkoz@redhat.com>
* 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 <bkoz@redhat.com> 2009-02-09 Benjamin Kosnik <bkoz@redhat.com>
* include/std/condition_variable (condition_variable): Remove * include/std/condition_variable (condition_variable): Remove
......
...@@ -45,7 +45,7 @@ ...@@ -45,7 +45,7 @@
#if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1) #if defined(_GLIBCXX_HAS_GTHREADS) && defined(_GLIBCXX_USE_C99_STDINT_TR1)
namespace std namespace std
{ {
/// condition_variable /// condition_variable
class condition_variable class condition_variable
...@@ -63,25 +63,25 @@ namespace std ...@@ -63,25 +63,25 @@ namespace std
condition_variable(const condition_variable&) = delete; condition_variable(const condition_variable&) = delete;
condition_variable& operator=(const condition_variable&) = delete; condition_variable& operator=(const condition_variable&) = delete;
void void
notify_one(); notify_one();
void void
notify_all(); notify_all();
void void
wait(unique_lock<mutex>& __lock); wait(unique_lock<mutex>& __lock);
template<typename _Predicate> template<typename _Predicate>
void void
wait(unique_lock<mutex>& __lock, _Predicate __p) wait(unique_lock<mutex>& __lock, _Predicate __p)
{ {
while (!__p()) while (!__p())
wait(__lock); wait(__lock);
} }
template<typename _Duration> template<typename _Duration>
bool bool
wait_until(unique_lock<mutex>& __lock, wait_until(unique_lock<mutex>& __lock,
const chrono::time_point<__clock_t, _Duration>& __atime) const chrono::time_point<__clock_t, _Duration>& __atime)
{ return __wait_until_impl(__lock, __atime); } { return __wait_until_impl(__lock, __atime); }
...@@ -94,7 +94,7 @@ namespace std ...@@ -94,7 +94,7 @@ namespace std
// DR 887 - Sync unknown clock to known clock. // DR 887 - Sync unknown clock to known clock.
typename _Clock::time_point __c_entry = _Clock::now(); typename _Clock::time_point __c_entry = _Clock::now();
__clock_t::time_point __s_entry = __clock_t::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; __clock_t::time_point __s_atime = __s_entry + __delta;
return __wait_until_impl(__lock, __s_atime); return __wait_until_impl(__lock, __s_atime);
...@@ -109,7 +109,7 @@ namespace std ...@@ -109,7 +109,7 @@ namespace std
while (!__p()) while (!__p())
if (!wait_until(__lock, __atime)) if (!wait_until(__lock, __atime))
return __p(); return __p();
return true; return true;
} }
...@@ -126,8 +126,8 @@ namespace std ...@@ -126,8 +126,8 @@ namespace std
_Predicate __p) _Predicate __p)
{ return wait_until(__lock, __clock_t::now() + __rtime, std::move(__p)); } { return wait_until(__lock, __clock_t::now() + __rtime, std::move(__p)); }
native_handle_type native_handle_type
native_handle() native_handle()
{ return &_M_cond; } { return &_M_cond; }
private: private:
...@@ -137,21 +137,21 @@ namespace std ...@@ -137,21 +137,21 @@ namespace std
const chrono::time_point<_Clock, _Duration>& __atime) const chrono::time_point<_Clock, _Duration>& __atime)
{ {
chrono::time_point<__clock_t, chrono::seconds> __s = chrono::time_point<__clock_t, chrono::seconds> __s =
chrono::time_point_cast<chrono::seconds>(__atime); chrono::time_point_cast<chrono::seconds>(__atime);
chrono::nanoseconds __ns = chrono::nanoseconds __ns =
chrono::duration_cast<chrono::nanoseconds>(__atime - __s); chrono::duration_cast<chrono::nanoseconds>(__atime - __s);
__gthread_time_t __ts = __gthread_time_t __ts =
{ {
static_cast<std::time_t>(__s.time_since_epoch().count()), static_cast<std::time_t>(__s.time_since_epoch().count()),
static_cast<long>(__ns.count()) static_cast<long>(__ns.count())
}; };
__gthread_cond_timedwait(&_M_cond, __lock.mutex()->native_handle(), __gthread_cond_timedwait(&_M_cond, __lock.mutex()->native_handle(),
&__ts); &__ts);
return _Clock::now() < __atime; return _Clock::now() < __atime;
} }
}; };
...@@ -167,36 +167,36 @@ namespace std ...@@ -167,36 +167,36 @@ namespace std
condition_variable_any(); condition_variable_any();
~condition_variable_any(); ~condition_variable_any();
condition_variable_any(const condition_variable_any&) = delete; condition_variable_any(const condition_variable_any&) = delete;
condition_variable_any& operator=(const condition_variable_any&) = delete; condition_variable_any& operator=(const condition_variable_any&) = delete;
void void
notify_one(); notify_one();
void void
notify_all(); notify_all();
template<typename _Lock> template<typename _Lock>
void void
wait(_Lock& __lock); wait(_Lock& __lock);
template<typename _Lock, typename _Predicate> template<typename _Lock, typename _Predicate>
void void
wait(_Lock& __lock, _Predicate __p); wait(_Lock& __lock, _Predicate __p);
template<typename _Lock, typename _Clock, typename _Duration> template<typename _Lock, typename _Clock, typename _Duration>
bool bool
wait_until(_Lock& __lock, wait_until(_Lock& __lock,
const chrono::time_point<_Clock, _Duration>& __atime); const chrono::time_point<_Clock, _Duration>& __atime);
template<typename _Lock, typename _Clock, template<typename _Lock, typename _Clock,
typename _Duration, typename _Predicate> typename _Duration, typename _Predicate>
bool bool
wait_until(_Lock& __lock, wait_until(_Lock& __lock,
const chrono::time_point<_Clock, _Duration>& __atime, const chrono::time_point<_Clock, _Duration>& __atime,
_Predicate __p); _Predicate __p);
template<typename _Lock, typename _Rep, typename _Period> template<typename _Lock, typename _Rep, typename _Period>
bool bool
wait_for(_Lock& __lock, const chrono::duration<_Rep, _Period>& __rtime); wait_for(_Lock& __lock, const chrono::duration<_Rep, _Period>& __rtime);
...@@ -204,10 +204,10 @@ namespace std ...@@ -204,10 +204,10 @@ namespace std
template<typename _Lock, typename _Rep, template<typename _Lock, typename _Rep,
typename _Period, typename _Predicate> typename _Period, typename _Predicate>
bool bool
wait_for(_Lock& __lock, wait_for(_Lock& __lock,
const chrono::duration<_Rep, _Period>& __rtime, _Predicate __p); const chrono::duration<_Rep, _Period>& __rtime, _Predicate __p);
native_handle_type native_handle_type
native_handle() native_handle()
{ return &_M_cond; } { return &_M_cond; }
}; };
......
...@@ -59,12 +59,12 @@ namespace std ...@@ -59,12 +59,12 @@ namespace std
int __e = __gthread_cond_wait(&_M_cond, __lock.mutex()->native_handle()); int __e = __gthread_cond_wait(&_M_cond, __lock.mutex()->native_handle());
if (__e) if (__e)
__throw_system_error(__e); __throw_system_error(__e);
} }
void void
condition_variable::notify_one() condition_variable::notify_one()
{ {
int __e = __gthread_cond_signal(&_M_cond); int __e = __gthread_cond_signal(&_M_cond);
// XXX not in spec // XXX not in spec
...@@ -73,9 +73,9 @@ namespace std ...@@ -73,9 +73,9 @@ namespace std
__throw_system_error(__e); __throw_system_error(__e);
} }
void void
condition_variable::notify_all() condition_variable::notify_all()
{ {
int __e = __gthread_cond_broadcast(&_M_cond); int __e = __gthread_cond_broadcast(&_M_cond);
// XXX not in spec // XXX not in spec
...@@ -96,11 +96,11 @@ namespace std ...@@ -96,11 +96,11 @@ namespace std
__throw_system_error(__e); __throw_system_error(__e);
#endif #endif
} }
condition_variable_any::~condition_variable_any() condition_variable_any::~condition_variable_any()
{ {
__gthread_cond_destroy(&_M_cond); __gthread_cond_destroy(&_M_cond);
} }
} }
#endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1 #endif // _GLIBCXX_HAS_GTHREADS && _GLIBCXX_USE_C99_STDINT_TR1
...@@ -29,6 +29,6 @@ ...@@ -29,6 +29,6 @@
int main() int main()
{ {
typedef std::condition_variable test_type; typedef std::condition_variable test_type;
__gnu_test::compare_type_to_native_type_sizes<test_type>(); __gnu_test::compare_type_to_native_type<test_type>();
return 0; return 0;
} }
...@@ -29,6 +29,6 @@ ...@@ -29,6 +29,6 @@
int main() int main()
{ {
typedef std::condition_variable_any test_type; typedef std::condition_variable_any test_type;
__gnu_test::compare_type_to_native_type_sizes<test_type>(); __gnu_test::compare_type_to_native_type<test_type>();
return 0; return 0;
} }
...@@ -29,6 +29,6 @@ ...@@ -29,6 +29,6 @@
int main() int main()
{ {
typedef std::mutex test_type; typedef std::mutex test_type;
__gnu_test::compare_type_to_native_type_sizes<test_type>(); __gnu_test::compare_type_to_native_type<test_type>();
return 0; return 0;
} }
...@@ -29,6 +29,6 @@ ...@@ -29,6 +29,6 @@
int main() int main()
{ {
typedef std::recursive_mutex test_type; typedef std::recursive_mutex test_type;
__gnu_test::compare_type_to_native_type_sizes<test_type>(); __gnu_test::compare_type_to_native_type<test_type>();
return 0; return 0;
} }
...@@ -29,6 +29,6 @@ ...@@ -29,6 +29,6 @@
int main() int main()
{ {
typedef std::recursive_timed_mutex test_type; typedef std::recursive_timed_mutex test_type;
__gnu_test::compare_type_to_native_type_sizes<test_type>(); __gnu_test::compare_type_to_native_type<test_type>();
return 0; return 0;
} }
...@@ -36,6 +36,9 @@ ...@@ -36,6 +36,9 @@
#include <system_error> #include <system_error>
#include <testsuite_hooks.h> #include <testsuite_hooks.h>
// thread default cons works
// thread default cons no throw
// thread default cons not joinable
int main() int main()
{ {
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
......
...@@ -32,7 +32,7 @@ ...@@ -32,7 +32,7 @@
// invalidate any other reasons why the executable file might be covered by // invalidate any other reasons why the executable file might be covered by
// the GNU General Public License. // the GNU General Public License.
#include <utility> // std::ref #include <functional> // std::ref
#include <thread> #include <thread>
#include <system_error> #include <system_error>
#include <testsuite_hooks.h> #include <testsuite_hooks.h>
...@@ -43,19 +43,27 @@ free_function(std::thread::id& id) ...@@ -43,19 +43,27 @@ free_function(std::thread::id& id)
id = std::this_thread::get_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() void test02()
{ {
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
try try
{ {
std::thread::id t1_id1; std::thread::id id1;
std::thread t1(free_function, std::ref(t1_id1)); std::thread t(free_function, std::ref(id1));
std::thread::id t1_id2 = t1.get_id(); std::thread::id id2 = t.get_id();
VERIFY( t1.joinable() ); VERIFY( t.joinable() );
t1.join(); t.join();
VERIFY( !t1.joinable() ); VERIFY( !t.joinable() );
VERIFY( t1_id1 == t1_id2 ); VERIFY( id1 == id2 );
} }
catch (const std::system_error&) catch (const std::system_error&)
{ {
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
// { dg-require-cstdint "" } // { dg-require-cstdint "" }
// { dg-require-gthreads "" } // { 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 // 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 // software; you can redistribute it and/or modify it under the
...@@ -32,8 +32,7 @@ ...@@ -32,8 +32,7 @@
// invalidate any other reasons why the executable file might be covered by // invalidate any other reasons why the executable file might be covered by
// the GNU General Public License. // the GNU General Public License.
#include <functional> // std::unary_function #include <functional> // std::unary_function, std::ref
#include <utility> // std::ref
#include <thread> #include <thread>
#include <system_error> #include <system_error>
#include <testsuite_hooks.h> #include <testsuite_hooks.h>
...@@ -55,6 +54,10 @@ struct copyable : public std::unary_function<std::thread::id&, void> ...@@ -55,6 +54,10 @@ struct copyable : public std::unary_function<std::thread::id&, void>
int copyable::copy_count = 0; 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() void test03()
{ {
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
......
...@@ -5,7 +5,7 @@ ...@@ -5,7 +5,7 @@
// { dg-require-cstdint "" } // { dg-require-cstdint "" }
// { dg-require-gthreads "" } // { 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 // 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 // software; you can redistribute it and/or modify it under the
...@@ -32,8 +32,7 @@ ...@@ -32,8 +32,7 @@
// invalidate any other reasons why the executable file might be covered by // invalidate any other reasons why the executable file might be covered by
// the GNU General Public License. // the GNU General Public License.
#include <functional> // std::unary_function #include <functional> // std::unary_function, std::ref, std::cref
#include <utility> // std::ref, std::cref
#include <thread> #include <thread>
#include <system_error> #include <system_error>
#include <testsuite_hooks.h> #include <testsuite_hooks.h>
...@@ -50,6 +49,12 @@ struct noncopyable : std::unary_function<std::thread::id&, void> ...@@ -50,6 +49,12 @@ struct noncopyable : std::unary_function<std::thread::id&, void>
} }
}; };
// 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() void test03()
{ {
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
......
...@@ -32,8 +32,7 @@ ...@@ -32,8 +32,7 @@
// invalidate any other reasons why the executable file might be covered by // invalidate any other reasons why the executable file might be covered by
// the GNU General Public License. // the GNU General Public License.
#include <functional> // std::unary_function #include <functional> // std::unary_function, std::ref
#include <utility> // std::ref
#include <thread> #include <thread>
#include <system_error> #include <system_error>
#include <testsuite_hooks.h> #include <testsuite_hooks.h>
......
...@@ -43,6 +43,10 @@ void f() ...@@ -43,6 +43,10 @@ void f()
f_was_called = true; f_was_called = true;
} }
// thread non-variadic cons, c++ function
// thread join
// thread join postcondition function called correctly
// no errors
void test06() void test06()
{ {
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
......
...@@ -51,6 +51,7 @@ struct copyable ...@@ -51,6 +51,7 @@ struct copyable
} }
}; };
// same as 6, but function is copyable function object passed by reference
void test07() void test07()
{ {
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
...@@ -59,8 +60,8 @@ void test07() ...@@ -59,8 +60,8 @@ void test07()
{ {
copyable c; copyable c;
copyable& rc = c; copyable& rc = c;
std::thread t1(rc); std::thread t(rc);
t1.join(); t.join();
VERIFY( functor_was_called ); VERIFY( functor_was_called );
} }
catch (const std::system_error&) catch (const std::system_error&)
......
...@@ -52,6 +52,7 @@ struct moveable ...@@ -52,6 +52,7 @@ struct moveable
} }
}; };
// same as 6, but function object is movable
void test08() void test08()
{ {
bool test __attribute__((unused)) = true; bool test __attribute__((unused)) = true;
...@@ -59,8 +60,8 @@ void test08() ...@@ -59,8 +60,8 @@ void test08()
try try
{ {
moveable m; moveable m;
std::thread t1(std::move(m)); std::thread t(std::move(m));
t1.join(); t.join();
VERIFY( functor_was_called ); VERIFY( functor_was_called );
} }
catch (const std::system_error&) catch (const std::system_error&)
......
...@@ -29,7 +29,7 @@ ...@@ -29,7 +29,7 @@
int main() int main()
{ {
typedef std::thread test_type; typedef std::thread test_type;
// XXX disable at the moment // XX disable for now
//__gnu_test::compare_type_to_native_type_sizes<test_type>(); //__gnu_test::compare_type_to_native_type<test_type>();
return 0; return 0;
} }
...@@ -29,6 +29,6 @@ ...@@ -29,6 +29,6 @@
int main() int main()
{ {
typedef std::timed_mutex test_type; typedef std::timed_mutex test_type;
__gnu_test::compare_type_to_native_type_sizes<test_type>(); __gnu_test::compare_type_to_native_type<test_type>();
return 0; return 0;
} }
...@@ -39,24 +39,29 @@ ...@@ -39,24 +39,29 @@
namespace __gnu_test namespace __gnu_test
{ {
// Assume _Tp::native_handle_type. // Assume _Tp::native_handle_type.
// Check C++ to native_handle_type characteristics: size and alignment.
template<typename _Tp> template<typename _Tp>
void void
compare_type_to_native_type_sizes() compare_type_to_native_type()
{ {
typedef _Tp test_type; typedef _Tp test_type;
typedef typename test_type::native_handle_type native_handle_type;
int st = sizeof(test_type);
// Remove possible pointer type. // Remove possible pointer type.
int snt = sizeof(typename std::remove_pointer<native_handle_type>::type); typedef typename test_type::native_handle_type native_handle;
typedef typename std::remove_pointer<native_handle>::type native_type;
if (st != snt)
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; std::ostringstream s;
s << std::endl; s << std::endl;
s << "size of _Tp: " << st << 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 << "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()); throw std::runtime_error(s.str());
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment