From fc5921fa592a0821f793aa3b4c2f438a99d5e4fa Mon Sep 17 00:00:00 2001 From: Bart Van Assche Date: Sat, 7 Jun 2014 07:31:56 +0000 Subject: [PATCH] drd/tests/std_thread: Enable this test program git-svn-id: svn://svn.valgrind.org/valgrind/trunk@14001 --- drd/tests/std_thread.cpp | 46 +++++++++++++++++++++++++++++++++++++ drd/tests/std_thread.vgtest | 2 +- 2 files changed, 47 insertions(+), 1 deletion(-) diff --git a/drd/tests/std_thread.cpp b/drd/tests/std_thread.cpp index e4487d4c6..4d637a388 100644 --- a/drd/tests/std_thread.cpp +++ b/drd/tests/std_thread.cpp @@ -10,6 +10,7 @@ #define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(addr) \ ANNOTATE_HAPPENS_AFTER(addr) #define _GLIBCXX_EXTERN_TEMPLATE -1 +#define _GLIBCXX_DEBUG 1 #include #include @@ -21,3 +22,48 @@ int main(int argc, char** argv) std::cerr << "Done.\n"; return 0; } + +// +// From libstdc++-v3/src/c++11/thread.cc +// + +#include + +extern "C" void* execute_native_thread_routine(void* __p) +{ + std::thread::_Impl_base* __t = static_cast(__p); + std::thread::__shared_base_type __local; + __local.swap(__t->_M_this_ptr); + + __try { + __t->_M_run(); + } __catch(const __cxxabiv1::__forced_unwind&) { + __throw_exception_again; + } __catch(...) { + std::terminate(); + } + + return 0; +} + +namespace std +{ + void thread::_M_start_thread(__shared_base_type __b) + { + if (!__gthread_active_p()) +#if __EXCEPTIONS + throw system_error(make_error_code(errc::operation_not_permitted), + "Enable multithreading to use std::thread"); +#else + __throw_system_error(int(errc::operation_not_permitted)); +#endif + + __b->_M_this_ptr = __b; + int __e = pthread_create(&_M_id._M_thread, NULL, + &execute_native_thread_routine, __b.get()); + if (__e) { + __b->_M_this_ptr.reset(); + __throw_system_error(__e); + } + } +} diff --git a/drd/tests/std_thread.vgtest b/drd/tests/std_thread.vgtest index e6264c2b5..aa30d15e5 100644 --- a/drd/tests/std_thread.vgtest +++ b/drd/tests/std_thread.vgtest @@ -1,4 +1,4 @@ -prereq: false && test -e std_thread && ./supported_libpthread +prereq: test -e std_thread && ./supported_libpthread vgopts: --check-stack-var=yes --show-confl-seg=no prog: std_thread stderr_filter: filter_stderr