diff options
Diffstat (limited to 'src/boost/libs/phoenix/test/scope/bug_000008.cpp')
-rw-r--r-- | src/boost/libs/phoenix/test/scope/bug_000008.cpp | 105 |
1 files changed, 105 insertions, 0 deletions
diff --git a/src/boost/libs/phoenix/test/scope/bug_000008.cpp b/src/boost/libs/phoenix/test/scope/bug_000008.cpp new file mode 100644 index 000000000..58adf4171 --- /dev/null +++ b/src/boost/libs/phoenix/test/scope/bug_000008.cpp @@ -0,0 +1,105 @@ +/*============================================================================= + 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 + |