1 | // Copyright (C) 2010 Vicente Botet |
---|---|
2 | // |
3 | // Distributed under the Boost Software License, Version 1.0. (See accompanying |
4 | // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) |
5 | |
6 | #include <iostream> |
7 | #include <boost/thread.hpp> |
8 | #include <boost/thread/thread_only.hpp> |
9 | #include <boost/optional.hpp> |
10 | #include <boost/detail/lightweight_test.hpp> |
11 | |
12 | using namespace boost; |
13 | using namespace boost::chrono; |
14 | |
15 | struct dummy_class_tracks_deletions |
16 | { |
17 | static unsigned deletions; |
18 | |
19 | dummy_class_tracks_deletions() |
20 | { |
21 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
22 | } |
23 | ~dummy_class_tracks_deletions() |
24 | { |
25 | ++deletions; |
26 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
27 | } |
28 | |
29 | }; |
30 | unsigned dummy_class_tracks_deletions::deletions=0; |
31 | |
32 | |
33 | optional<thread_specific_ptr<dummy_class_tracks_deletions> > optr; |
34 | //struct X |
35 | //{ |
36 | // thread_specific_ptr<int> f; |
37 | //} sptr; |
38 | |
39 | void other_thread() |
40 | { |
41 | |
42 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
43 | optr = none; |
44 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
45 | optr = in_place(); |
46 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
47 | BOOST_TEST(optr->get() == 0); |
48 | this_thread::sleep(rel_time: posix_time::seconds(5)); |
49 | BOOST_TEST(optr->get() == 0); |
50 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
51 | |
52 | } |
53 | |
54 | int main() |
55 | { |
56 | |
57 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
58 | dummy_class_tracks_deletions * pi = new dummy_class_tracks_deletions; |
59 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
60 | optr = in_place(); |
61 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
62 | optr->reset(new_value: pi); |
63 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
64 | BOOST_TEST(optr->get() == pi); |
65 | thread t1(bind(f: &other_thread)); |
66 | this_thread::sleep(rel_time: posix_time::seconds(5)); |
67 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
68 | BOOST_TEST(optr->get() == pi); |
69 | std::cout << __FILE__ << ":"<< __LINE__ << boost::this_thread::get_id() << std::endl; |
70 | t1.join(); |
71 | return boost::report_errors(); |
72 | |
73 | } |
74 |