123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105 |
- /*=============================================================================
- 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
|