/Src/Dependencies/Boost/libs/phoenix/test/scope/bug_000008.cpp
http://hadesmem.googlecode.com/ · C++ · 97 lines · 67 code · 16 blank · 14 comment · 7 complexity · 50a3ca0281e21137c59e08256eba4d2e MD5 · raw file
- /*=============================================================================
- Copyright (c) 2003 Martin Wille
- Copyright (c) 2001-2007 Joel de Guzman
- 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.
- #include <iostream>
- #include <boost/config.hpp>
- #include <boost/assert.hpp>
- #include <boost/detail/lightweight_test.hpp>
- #include <boost/spirit/home/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/spirit/include/phoenix_operator.hpp>
- #include <boost/spirit/include/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) {}
- 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