This is the mail archive of the
libstdc++@gcc.gnu.org
mailing list for the libstdc++ project.
[v3] thread testsuite additions
- From: Benjamin Kosnik <bkoz at redhat dot com>
- To: libstdc++ at gcc dot gnu dot org, gcc-patches at gcc dot gnu dot org
- Date: Thu, 12 Feb 2009 16:16:49 -0800
- Subject: [v3] thread testsuite additions
Add in alignment checking, two new tests. Add some comments in existing
thread ctor tests, cleanup whitespace in condition_variable.
tested x86_64/linux
-benjamin
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.
Index: src/condition_variable.cc
===================================================================
--- src/condition_variable.cc (revision 144140)
+++ src/condition_variable.cc (working copy)
@@ -59,12 +59,12 @@
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 @@
__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 @@
__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
Index: include/std/condition_variable
===================================================================
--- include/std/condition_variable (revision 144140)
+++ include/std/condition_variable (working copy)
@@ -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 @@
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<mutex>& __lock);
template<typename _Predicate>
- void
+ void
wait(unique_lock<mutex>& __lock, _Predicate __p)
{
while (!__p())
wait(__lock);
}
-
+
template<typename _Duration>
- bool
+ bool
wait_until(unique_lock<mutex>& __lock,
const chrono::time_point<__clock_t, _Duration>& __atime)
{ return __wait_until_impl(__lock, __atime); }
@@ -94,7 +94,7 @@
// 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 @@
while (!__p())
if (!wait_until(__lock, __atime))
return __p();
-
+
return true;
}
@@ -126,8 +126,8 @@
_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 @@
const chrono::time_point<_Clock, _Duration>& __atime)
{
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::duration_cast<chrono::nanoseconds>(__atime - __s);
-
- __gthread_time_t __ts =
- {
- static_cast<std::time_t>(__s.time_since_epoch().count()),
- static_cast<long>(__ns.count())
- };
-
- __gthread_cond_timedwait(&_M_cond, __lock.mutex()->native_handle(),
- &__ts);
-
- return _Clock::now() < __atime;
+ chrono::duration_cast<chrono::nanoseconds>(__atime - __s);
+
+ __gthread_time_t __ts =
+ {
+ static_cast<std::time_t>(__s.time_since_epoch().count()),
+ static_cast<long>(__ns.count())
+ };
+
+ __gthread_cond_timedwait(&_M_cond, __lock.mutex()->native_handle(),
+ &__ts);
+
+ return _Clock::now() < __atime;
}
};
@@ -167,36 +167,36 @@
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<typename _Lock>
- void
+ void
wait(_Lock& __lock);
template<typename _Lock, typename _Predicate>
- void
+ void
wait(_Lock& __lock, _Predicate __p);
template<typename _Lock, typename _Clock, typename _Duration>
- bool
+ bool
wait_until(_Lock& __lock,
const chrono::time_point<_Clock, _Duration>& __atime);
- template<typename _Lock, typename _Clock,
+ template<typename _Lock, typename _Clock,
typename _Duration, typename _Predicate>
- bool
+ bool
wait_until(_Lock& __lock,
const chrono::time_point<_Clock, _Duration>& __atime,
_Predicate __p);
-
+
template<typename _Lock, typename _Rep, typename _Period>
bool
wait_for(_Lock& __lock, const chrono::duration<_Rep, _Period>& __rtime);
@@ -204,10 +204,10 @@
template<typename _Lock, typename _Rep,
typename _Period, typename _Predicate>
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; }
};
Index: testsuite/30_threads/condition_variable_any/native_handle/typesizes.cc
===================================================================
--- testsuite/30_threads/condition_variable_any/native_handle/typesizes.cc (revision 144140)
+++ testsuite/30_threads/condition_variable_any/native_handle/typesizes.cc (working copy)
@@ -29,6 +29,6 @@
int main()
{
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;
}
Index: testsuite/30_threads/mutex/native_handle/typesizes.cc
===================================================================
--- testsuite/30_threads/mutex/native_handle/typesizes.cc (revision 144140)
+++ testsuite/30_threads/mutex/native_handle/typesizes.cc (working copy)
@@ -29,6 +29,6 @@
int main()
{
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;
}
Index: testsuite/30_threads/timed_mutex/native_handle/typesizes.cc
===================================================================
--- testsuite/30_threads/timed_mutex/native_handle/typesizes.cc (revision 144140)
+++ testsuite/30_threads/timed_mutex/native_handle/typesizes.cc (working copy)
@@ -29,6 +29,6 @@
int main()
{
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;
}
Index: testsuite/30_threads/thread/native_handle/typesizes.cc
===================================================================
--- testsuite/30_threads/thread/native_handle/typesizes.cc (revision 144140)
+++ testsuite/30_threads/thread/native_handle/typesizes.cc (working copy)
@@ -29,7 +29,7 @@
int main()
{
typedef std::thread test_type;
- // XXX disable at the moment
- //__gnu_test::compare_type_to_native_type_sizes<test_type>();
+ // XX disable for now
+ //__gnu_test::compare_type_to_native_type<test_type>();
return 0;
}
Index: testsuite/30_threads/thread/cons/1.cc
===================================================================
--- testsuite/30_threads/thread/cons/1.cc (revision 144140)
+++ testsuite/30_threads/thread/cons/1.cc (working copy)
@@ -36,6 +36,9 @@
#include <system_error>
#include <testsuite_hooks.h>
+// thread default cons works
+// thread default cons no throw
+// thread default cons not joinable
int main()
{
bool test __attribute__((unused)) = true;
Index: testsuite/30_threads/thread/cons/2.cc
===================================================================
--- testsuite/30_threads/thread/cons/2.cc (revision 144140)
+++ testsuite/30_threads/thread/cons/2.cc (working copy)
@@ -32,7 +32,7 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#include <utility> // std::ref
+#include <functional> // std::ref
#include <thread>
#include <system_error>
#include <testsuite_hooks.h>
@@ -43,19 +43,27 @@
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&)
{
Index: testsuite/30_threads/thread/cons/3.cc
===================================================================
--- testsuite/30_threads/thread/cons/3.cc (revision 144140)
+++ testsuite/30_threads/thread/cons/3.cc (working copy)
@@ -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 <functional> // std::unary_function
-#include <utility> // std::ref
+#include <functional> // std::unary_function, std::ref
#include <thread>
#include <system_error>
#include <testsuite_hooks.h>
@@ -55,6 +54,10 @@
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;
Index: testsuite/30_threads/thread/cons/4.cc
===================================================================
--- testsuite/30_threads/thread/cons/4.cc (revision 144140)
+++ testsuite/30_threads/thread/cons/4.cc (working copy)
@@ -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 <functional> // std::unary_function
-#include <utility> // std::ref, std::cref
+#include <functional> // std::unary_function, std::ref, std::cref
#include <thread>
#include <system_error>
#include <testsuite_hooks.h>
@@ -50,6 +49,12 @@
}
};
+// 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;
Index: testsuite/30_threads/thread/cons/5.cc
===================================================================
--- testsuite/30_threads/thread/cons/5.cc (revision 144140)
+++ testsuite/30_threads/thread/cons/5.cc (working copy)
@@ -32,8 +32,7 @@
// invalidate any other reasons why the executable file might be covered by
// the GNU General Public License.
-#include <functional> // std::unary_function
-#include <utility> // std::ref
+#include <functional> // std::unary_function, std::ref
#include <thread>
#include <system_error>
#include <testsuite_hooks.h>
Index: testsuite/30_threads/thread/cons/6.cc
===================================================================
--- testsuite/30_threads/thread/cons/6.cc (revision 144140)
+++ testsuite/30_threads/thread/cons/6.cc (working copy)
@@ -43,6 +43,10 @@
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;
Index: testsuite/30_threads/thread/cons/7.cc
===================================================================
--- testsuite/30_threads/thread/cons/7.cc (revision 144140)
+++ testsuite/30_threads/thread/cons/7.cc (working copy)
@@ -51,6 +51,7 @@
}
};
+// same as 6, but function is copyable function object passed by reference
void test07()
{
bool test __attribute__((unused)) = true;
@@ -59,8 +60,8 @@
{
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&)
Index: testsuite/30_threads/thread/cons/8.cc
===================================================================
--- testsuite/30_threads/thread/cons/8.cc (revision 144140)
+++ testsuite/30_threads/thread/cons/8.cc (working copy)
@@ -52,6 +52,7 @@
}
};
+// same as 6, but function object is movable
void test08()
{
bool test __attribute__((unused)) = true;
@@ -59,8 +60,8 @@
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&)
Index: testsuite/30_threads/recursive_mutex/native_handle/typesizes.cc
===================================================================
--- testsuite/30_threads/recursive_mutex/native_handle/typesizes.cc (revision 144140)
+++ testsuite/30_threads/recursive_mutex/native_handle/typesizes.cc (working copy)
@@ -29,6 +29,6 @@
int main()
{
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;
}
Index: testsuite/30_threads/condition_variable/native_handle/typesizes.cc
===================================================================
--- testsuite/30_threads/condition_variable/native_handle/typesizes.cc (revision 144140)
+++ testsuite/30_threads/condition_variable/native_handle/typesizes.cc (working copy)
@@ -29,6 +29,6 @@
int main()
{
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;
}
Index: testsuite/30_threads/recursive_timed_mutex/native_handle/typesizes.cc
===================================================================
--- testsuite/30_threads/recursive_timed_mutex/native_handle/typesizes.cc (revision 144140)
+++ testsuite/30_threads/recursive_timed_mutex/native_handle/typesizes.cc (working copy)
@@ -29,6 +29,6 @@
int main()
{
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;
}
Index: testsuite/util/thread/all.h
===================================================================
--- testsuite/util/thread/all.h (revision 144140)
+++ testsuite/util/thread/all.h (working copy)
@@ -39,24 +39,29 @@
namespace __gnu_test
{
// Assume _Tp::native_handle_type.
+ // Check C++ to native_handle_type characteristics: size and alignment.
template<typename _Tp>
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;
+ // Remove possible pointer type.
+ typedef typename test_type::native_handle_type native_handle;
+ typedef typename std::remove_pointer<native_handle>::type native_type;
+
int st = sizeof(test_type);
-
- // Remove possible pointer type.
- int snt = sizeof(typename std::remove_pointer<native_handle_type>::type);
-
- if (st != snt)
+ 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());
}
}