mirror of git://gcc.gnu.org/git/gcc.git
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
This commit is contained in:
parent
ed7284dd13
commit
d5cf20212b
|
@ -1,3 +1,33 @@
|
|||
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>
|
||||
|
||||
* include/std/condition_variable (condition_variable): Remove
|
||||
|
|
|
@ -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<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 @@ 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<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 @@ 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<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 @@ namespace std
|
|||
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; }
|
||||
};
|
||||
|
|
|
@ -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
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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 @@ 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&)
|
||||
{
|
||||
|
|
|
@ -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 @@ struct copyable : public std::unary_function<std::thread::id&, void>
|
|||
|
||||
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;
|
||||
|
|
|
@ -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 @@ 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()
|
||||
{
|
||||
bool test __attribute__((unused)) = true;
|
||||
|
|
|
@ -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>
|
||||
|
|
|
@ -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;
|
||||
|
|
|
@ -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&)
|
||||
|
|
|
@ -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&)
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
|
|
|
@ -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;
|
||||
|
||||
int st = sizeof(test_type);
|
||||
|
||||
// Remove possible pointer type.
|
||||
int snt = sizeof(typename std::remove_pointer<native_handle_type>::type);
|
||||
|
||||
if (st != snt)
|
||||
typedef typename test_type::native_handle_type native_handle;
|
||||
typedef typename std::remove_pointer<native_handle>::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());
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue