/*============================================================================= 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 #include #include #include // Testing problems in thread/future //#include //#include //using boost::move_detail::is_copy_constructible; #include #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 #include #include static const int number_of_calls_per_thread=20000; struct test_dynamic : boost::phoenix::dynamic { // 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 frame(s); (s.b = 123)(); { boost::phoenix::dynamic_frame 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