mirror of
https://github.com/boostorg/thread.git
synced 2026-02-10 11:52:10 +00:00
https://svn.boost.org/svn/boost/trunk ........ r43555 | emildotchevski | 2008-03-10 13:18:19 -0700 (Mon, 10 Mar 2008) | 5 lines fix for: boost/exception/enable_exception_cloning.hpp uses std::bad_alloc without #include'ing <new>. Because of this, some exception library tests fail to compile on HP-UX. ........ r43565 | hljin | 2008-03-11 10:28:42 -0700 (Tue, 11 Mar 2008) | 1 line Fixed two minor compiler errors showing up under in the new GCC 4.3.0 ........ r43566 | noel_belcourt | 2008-03-11 10:57:54 -0700 (Tue, 11 Mar 2008) | 6 lines A user-config.jam that defined multiple python toolsets exposed an error in the python.jam init rule. Moved the feature definition out of the init rule to avoid the feature redefinition error. ........ r43569 | chris_kohlhoff | 2008-03-12 06:25:49 -0700 (Wed, 12 Mar 2008) | 4 lines Revert to having the windows-bug workaround (short timeout on GetQueuedCompletionStatus) on all threads as there are still scenarios where threads can get stuck indefinitely. ........ r43570 | chris_kohlhoff | 2008-03-12 06:26:41 -0700 (Wed, 12 Mar 2008) | 3 lines Use unions to fix a sockaddr_storage aliasing problem that shows up with g++ 4.3.0. ........ r43572 | djenkins | 2008-03-12 07:46:24 -0700 (Wed, 12 Mar 2008) | 1 line Added test for keep() of nested regex with action ........ r43573 | djenkins | 2008-03-12 07:48:32 -0700 (Wed, 12 Mar 2008) | 1 line Fix keep() of nested regex with action ........ r43586 | chris_kohlhoff | 2008-03-12 23:59:02 -0700 (Wed, 12 Mar 2008) | 2 lines Fix incorrect use of sin_port with a sockaddr_in6 structure. ........ r43590 | johnmaddock | 2008-03-13 06:16:19 -0700 (Thu, 13 Mar 2008) | 2 lines Updated equations so that they are all 120dpi images. Also tweaked a few for better readability. ........ r43592 | eric_niebler | 2008-03-13 10:22:59 -0700 (Thu, 13 Mar 2008) | 1 line work around msvc bug ........ r43593 | eric_niebler | 2008-03-13 10:46:09 -0700 (Thu, 13 Mar 2008) | 1 line add lambda example, fix doc errors and typos ........ r43595 | bemandawes | 2008-03-13 13:10:08 -0700 (Thu, 13 Mar 2008) | 1 line Bring back more/more.htm, supply links for pages moved to website ........ r43600 | bemandawes | 2008-03-14 05:10:23 -0700 (Fri, 14 Mar 2008) | 1 line Add forwarding file, thus resolving many broken links ........ r43601 | bemandawes | 2008-03-14 05:17:18 -0700 (Fri, 14 Mar 2008) | 1 line Add forwarding file, thus resolving many broken links ........ r43605 | t_schwinger | 2008-03-14 10:59:22 -0700 (Fri, 14 Mar 2008) | 3 lines attempts to finally make Sun work ........ r43606 | t_schwinger | 2008-03-14 11:29:26 -0700 (Fri, 14 Mar 2008) | 3 lines resolves #1100 and #1602 ........ r43607 | johnmaddock | 2008-03-14 11:32:45 -0700 (Fri, 14 Mar 2008) | 1 line Fixed Inspection report issues. ........ r43608 | t_schwinger | 2008-03-14 11:36:46 -0700 (Fri, 14 Mar 2008) | 3 lines adds acknowledgement for Noel helping to support Sun compilers ........ r43619 | bemandawes | 2008-03-15 05:46:02 -0700 (Sat, 15 Mar 2008) | 1 line Fix broken link, add count of new libraries. ........ r43621 | danieljames | 2008-03-15 05:59:21 -0700 (Sat, 15 Mar 2008) | 1 line Update type traits links for new location. ........ r43622 | danieljames | 2008-03-15 06:04:57 -0700 (Sat, 15 Mar 2008) | 1 line Regenerate the type traits docs, to get changes from [43621]. Refs #1686. ........ r43625 | johnmaddock | 2008-03-15 06:52:49 -0700 (Sat, 15 Mar 2008) | 1 line Fix a pair of broken links and regenerate the docs. ........ r43632 | johnmaddock | 2008-03-15 11:19:11 -0700 (Sat, 15 Mar 2008) | 1 line Added missing files. ........ r43633 | johnmaddock | 2008-03-15 11:41:51 -0700 (Sat, 15 Mar 2008) | 1 line Fix some inspection report issues. ........ r43640 | chris_kohlhoff | 2008-03-15 15:37:58 -0700 (Sat, 15 Mar 2008) | 2 lines Merge asio doc fixes from release branch. ........ r43641 | eric_niebler | 2008-03-15 16:43:21 -0700 (Sat, 15 Mar 2008) | 1 line range-based regex_replace, address LWG issues #726 and #727, misc. feedback about proto and docs ........ r43642 | hljin | 2008-03-15 16:44:54 -0700 (Sat, 15 Mar 2008) | 1 line Add copyright notice and Boost license ........ r43643 | hljin | 2008-03-15 16:45:25 -0700 (Sat, 15 Mar 2008) | 1 line Added copyright notice and Boost license ........ r43644 | hljin | 2008-03-15 16:50:04 -0700 (Sat, 15 Mar 2008) | 1 line Added copyright notice and Boost license ........ r43645 | hljin | 2008-03-15 16:53:32 -0700 (Sat, 15 Mar 2008) | 1 line Added copyright notice and Boost license ........ r43646 | hkaiser | 2008-03-15 18:39:59 -0700 (Sat, 15 Mar 2008) | 1 line Wave: Fixed whitespace insertion error, fixed test cases. ........ r43647 | eric_niebler | 2008-03-15 23:49:13 -0700 (Sat, 15 Mar 2008) | 1 line regex_replace supports formatter functions and function objects ........ r43660 | eric_niebler | 2008-03-16 15:37:06 -0700 (Sun, 16 Mar 2008) | 1 line allow lambdas to be used as formatters ........ r43661 | eric_niebler | 2008-03-16 16:06:26 -0700 (Sun, 16 Mar 2008) | 1 line more tests for new regex_replace functionality ........ r43662 | igaztanaga | 2008-03-16 16:55:49 -0700 (Sun, 16 Mar 2008) | 1 line Fixed ticket #1683 ........ r43663 | eric_niebler | 2008-03-16 17:35:04 -0700 (Sun, 16 Mar 2008) | 1 line document new format flags, and range-based interface for regex_match and regex_search ........ r43666 | anthonyw | 2008-03-17 01:36:09 -0700 (Mon, 17 Mar 2008) | 1 line Test and fix for bug #1693 to ensure thread_specific_ptr works as desired ........ r43671 | anthonyw | 2008-03-17 03:29:27 -0700 (Mon, 17 Mar 2008) | 1 line New documentation for new thread library ........ r43676 | bemandawes | 2008-03-17 09:53:58 -0700 (Mon, 17 Mar 2008) | 1 line Add function_types ........ [SVN r43682]
277 lines
6.2 KiB
C++
277 lines
6.2 KiB
C++
// Copyright (C) 2001-2003
|
|
// William E. Kempf
|
|
// Copyright (C) 2007 Anthony Williams
|
|
//
|
|
// Distributed under the Boost Software License, Version 1.0. (See accompanying
|
|
// file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
|
|
|
|
#include <boost/thread/detail/config.hpp>
|
|
|
|
#include <boost/thread/tss.hpp>
|
|
#include <boost/thread/mutex.hpp>
|
|
#include <boost/thread/thread.hpp>
|
|
|
|
#include <boost/test/unit_test.hpp>
|
|
|
|
#include <libs/thread/test/util.inl>
|
|
|
|
#include <iostream>
|
|
|
|
#if defined(BOOST_HAS_WINTHREADS)
|
|
#define WIN32_LEAN_AND_MEAN
|
|
#include <windows.h>
|
|
#endif
|
|
|
|
boost::mutex check_mutex;
|
|
boost::mutex tss_mutex;
|
|
int tss_instances = 0;
|
|
int tss_total = 0;
|
|
|
|
struct tss_value_t
|
|
{
|
|
tss_value_t()
|
|
{
|
|
boost::mutex::scoped_lock lock(tss_mutex);
|
|
++tss_instances;
|
|
++tss_total;
|
|
value = 0;
|
|
}
|
|
~tss_value_t()
|
|
{
|
|
boost::mutex::scoped_lock lock(tss_mutex);
|
|
--tss_instances;
|
|
}
|
|
int value;
|
|
};
|
|
|
|
boost::thread_specific_ptr<tss_value_t> tss_value;
|
|
|
|
void test_tss_thread()
|
|
{
|
|
tss_value.reset(new tss_value_t());
|
|
for (int i=0; i<1000; ++i)
|
|
{
|
|
int& n = tss_value->value;
|
|
// Don't call BOOST_CHECK_EQUAL directly, as it doesn't appear to
|
|
// be thread safe. Must evaluate further.
|
|
if (n != i)
|
|
{
|
|
boost::mutex::scoped_lock lock(check_mutex);
|
|
BOOST_CHECK_EQUAL(n, i);
|
|
}
|
|
++n;
|
|
}
|
|
}
|
|
|
|
#if defined(BOOST_THREAD_PLATFORM_WIN32)
|
|
typedef HANDLE native_thread_t;
|
|
|
|
DWORD WINAPI test_tss_thread_native(LPVOID lpParameter)
|
|
{
|
|
test_tss_thread();
|
|
return 0;
|
|
}
|
|
|
|
native_thread_t create_native_thread(void)
|
|
{
|
|
native_thread_t const res=CreateThread(
|
|
0, //security attributes (0 = not inheritable)
|
|
0, //stack size (0 = default)
|
|
&test_tss_thread_native, //function to execute
|
|
0, //parameter to pass to function
|
|
0, //creation flags (0 = run immediately)
|
|
0 //thread id (0 = thread id not returned)
|
|
);
|
|
BOOST_CHECK(res!=0);
|
|
return res;
|
|
}
|
|
|
|
void join_native_thread(native_thread_t thread)
|
|
{
|
|
DWORD res = WaitForSingleObject(thread, INFINITE);
|
|
BOOST_CHECK(res == WAIT_OBJECT_0);
|
|
|
|
res = CloseHandle(thread);
|
|
BOOST_CHECK(SUCCEEDED(res));
|
|
}
|
|
#elif defined(BOOST_THREAD_PLATFORM_PTHREAD)
|
|
typedef pthread_t native_thread_t;
|
|
|
|
extern "C"
|
|
{
|
|
void* test_tss_thread_native(void* lpParameter)
|
|
{
|
|
test_tss_thread();
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
native_thread_t create_native_thread()
|
|
{
|
|
native_thread_t thread_handle;
|
|
|
|
int const res = pthread_create(&thread_handle, 0, &test_tss_thread_native, 0);
|
|
BOOST_CHECK(!res);
|
|
return thread_handle;
|
|
}
|
|
|
|
void join_native_thread(native_thread_t thread)
|
|
{
|
|
void* result=0;
|
|
int const res=pthread_join(thread,&result);
|
|
BOOST_CHECK(!res);
|
|
}
|
|
#endif
|
|
|
|
void do_test_tss()
|
|
{
|
|
tss_instances = 0;
|
|
tss_total = 0;
|
|
|
|
const int NUMTHREADS=5;
|
|
boost::thread_group threads;
|
|
try
|
|
{
|
|
for (int i=0; i<NUMTHREADS; ++i)
|
|
threads.create_thread(&test_tss_thread);
|
|
threads.join_all();
|
|
}
|
|
catch(...)
|
|
{
|
|
threads.interrupt_all();
|
|
threads.join_all();
|
|
throw;
|
|
}
|
|
|
|
|
|
std::cout
|
|
<< "tss_instances = " << tss_instances
|
|
<< "; tss_total = " << tss_total
|
|
<< "\n";
|
|
std::cout.flush();
|
|
|
|
BOOST_CHECK_EQUAL(tss_instances, 0);
|
|
BOOST_CHECK_EQUAL(tss_total, 5);
|
|
|
|
tss_instances = 0;
|
|
tss_total = 0;
|
|
|
|
native_thread_t thread1 = create_native_thread();
|
|
native_thread_t thread2 = create_native_thread();
|
|
native_thread_t thread3 = create_native_thread();
|
|
native_thread_t thread4 = create_native_thread();
|
|
native_thread_t thread5 = create_native_thread();
|
|
|
|
join_native_thread(thread5);
|
|
join_native_thread(thread4);
|
|
join_native_thread(thread3);
|
|
join_native_thread(thread2);
|
|
join_native_thread(thread1);
|
|
|
|
std::cout
|
|
<< "tss_instances = " << tss_instances
|
|
<< "; tss_total = " << tss_total
|
|
<< "\n";
|
|
std::cout.flush();
|
|
|
|
// The following is not really an error. TSS cleanup support still is available for boost threads.
|
|
// Also this usually will be triggered only when bound to the static version of thread lib.
|
|
// 2006-10-02 Roland Schwarz
|
|
//BOOST_CHECK_EQUAL(tss_instances, 0);
|
|
BOOST_CHECK_MESSAGE(tss_instances == 0, "Support of automatic tss cleanup for native threading API not available");
|
|
BOOST_CHECK_EQUAL(tss_total, 5);
|
|
}
|
|
|
|
void test_tss()
|
|
{
|
|
timed_test(&do_test_tss, 2);
|
|
}
|
|
|
|
bool tss_cleanup_called=false;
|
|
|
|
struct Dummy
|
|
{};
|
|
|
|
void tss_custom_cleanup(Dummy* d)
|
|
{
|
|
delete d;
|
|
tss_cleanup_called=true;
|
|
}
|
|
|
|
boost::thread_specific_ptr<Dummy> tss_with_cleanup(tss_custom_cleanup);
|
|
|
|
void tss_thread_with_custom_cleanup()
|
|
{
|
|
tss_with_cleanup.reset(new Dummy);
|
|
}
|
|
|
|
void do_test_tss_with_custom_cleanup()
|
|
{
|
|
boost::thread t(tss_thread_with_custom_cleanup);
|
|
try
|
|
{
|
|
t.join();
|
|
}
|
|
catch(...)
|
|
{
|
|
t.interrupt();
|
|
t.join();
|
|
throw;
|
|
}
|
|
|
|
BOOST_CHECK(tss_cleanup_called);
|
|
}
|
|
|
|
|
|
void test_tss_with_custom_cleanup()
|
|
{
|
|
timed_test(&do_test_tss_with_custom_cleanup, 2);
|
|
}
|
|
|
|
Dummy* tss_object=new Dummy;
|
|
|
|
void tss_thread_with_custom_cleanup_and_release()
|
|
{
|
|
tss_with_cleanup.reset(tss_object);
|
|
tss_with_cleanup.release();
|
|
}
|
|
|
|
void do_test_tss_does_no_cleanup_after_release()
|
|
{
|
|
tss_cleanup_called=false;
|
|
boost::thread t(tss_thread_with_custom_cleanup_and_release);
|
|
try
|
|
{
|
|
t.join();
|
|
}
|
|
catch(...)
|
|
{
|
|
t.interrupt();
|
|
t.join();
|
|
throw;
|
|
}
|
|
|
|
BOOST_CHECK(!tss_cleanup_called);
|
|
if(!tss_cleanup_called)
|
|
{
|
|
delete tss_object;
|
|
}
|
|
}
|
|
|
|
void test_tss_does_no_cleanup_after_release()
|
|
{
|
|
timed_test(&do_test_tss_does_no_cleanup_after_release, 2);
|
|
}
|
|
|
|
boost::unit_test_framework::test_suite* init_unit_test_suite(int, char*[])
|
|
{
|
|
boost::unit_test_framework::test_suite* test =
|
|
BOOST_TEST_SUITE("Boost.Threads: tss test suite");
|
|
|
|
test->add(BOOST_TEST_CASE(test_tss));
|
|
test->add(BOOST_TEST_CASE(test_tss_with_custom_cleanup));
|
|
test->add(BOOST_TEST_CASE(test_tss_does_no_cleanup_after_release));
|
|
|
|
return test;
|
|
}
|