106 lines
2.6 KiB
C++
106 lines
2.6 KiB
C++
/*=============================================================================
|
|
Copyright (c) 2003 Martin Wille
|
|
Copyright (c) 2001-2007 Joel de Guzman
|
|
Copyright (c) 2015 John Fletcher
|
|
|
|
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)
|
|
=============================================================================*/
|
|
|
|
// see http://article.gmane.org/gmane.comp.parsers.spirit.general/4575
|
|
// or https://sf.net/mailarchive/forum.php?thread_id=2692308&forum_id=1595
|
|
// for a description of the bug being tested for by this program
|
|
//
|
|
// This code is borrowed from Spirit's bug_000008.cpp test for multithreads.
|
|
// Now modified to point to the Phoenix headers
|
|
// instead of the ones in Spirit.
|
|
#include <iostream>
|
|
#include <boost/config.hpp>
|
|
#include <boost/assert.hpp>
|
|
#include <boost/detail/lightweight_test.hpp>
|
|
// Testing problems in thread/future
|
|
//#include <boost/move/move.hpp>
|
|
//#include <boost/move/detail/type_traits.hpp>
|
|
//using boost::move_detail::is_copy_constructible;
|
|
#include <boost/phoenix/scope/dynamic.hpp>
|
|
|
|
#if defined(DONT_HAVE_BOOST) \
|
|
|| !defined(BOOST_HAS_THREADS) \
|
|
|| defined(BOOST_DISABLE_THREADS) \
|
|
|| (defined(__GNUC__) && defined(__WIN32__)) // MinGW
|
|
#define SKIP_TEST
|
|
#endif
|
|
|
|
|
|
#if defined(SKIP_TEST)
|
|
// we end here if we can't do multithreading
|
|
static void skipped()
|
|
{
|
|
std::cout << "skipped\n";
|
|
}
|
|
|
|
int
|
|
main()
|
|
{
|
|
skipped();
|
|
return boost::report_errors();
|
|
}
|
|
|
|
#else
|
|
// the real MT stuff
|
|
|
|
#include <boost/phoenix/operator.hpp>
|
|
#include <boost/phoenix/scope.hpp>
|
|
#include <boost/thread.hpp>
|
|
|
|
static const int number_of_calls_per_thread=20000;
|
|
|
|
struct test_dynamic : boost::phoenix::dynamic<int>
|
|
{
|
|
// test_dynamic() : b(*this) {}
|
|
test_dynamic() : b(init<0>(this)) {}
|
|
member1 b;
|
|
};
|
|
|
|
void
|
|
in_thread(void)
|
|
{
|
|
test_dynamic s; // should now be a local
|
|
|
|
for (int i = 0; i < number_of_calls_per_thread; ++i)
|
|
{
|
|
boost::phoenix::dynamic_frame<test_dynamic::self_type> frame(s);
|
|
(s.b = 123)();
|
|
{
|
|
boost::phoenix::dynamic_frame<test_dynamic::self_type> frame(s);
|
|
(s.b = 456)();
|
|
BOOST_ASSERT((s.b == 456)());
|
|
}
|
|
BOOST_ASSERT((s.b == 123)());
|
|
}
|
|
}
|
|
|
|
void
|
|
bug_000008()
|
|
{
|
|
boost::thread t1(in_thread);
|
|
boost::thread t2(in_thread);
|
|
boost::thread t3(in_thread);
|
|
boost::thread t4(in_thread);
|
|
|
|
t1.join();
|
|
t2.join();
|
|
t3.join();
|
|
t4.join();
|
|
}
|
|
|
|
int
|
|
main()
|
|
{
|
|
bug_000008();
|
|
return boost::report_errors();
|
|
}
|
|
|
|
#endif
|
|
|