]> git.proxmox.com Git - ceph.git/blob - ceph/src/boost/libs/interprocess/test/enable_shared_from_this_test.cpp
import quincy beta 17.1.0
[ceph.git] / ceph / src / boost / libs / interprocess / test / enable_shared_from_this_test.cpp
1 //////////////////////////////////////////////////////////////////////////////
2 // Copyright (c) 2002, 2003 Peter Dimov
3 //
4 // This file is the adaptation of shared_from_this_test.cpp from smart_ptr library
5 //
6 // (C) Copyright Ion Gaztanaga 2005-2012. Distributed under the Boost
7 // Software License, Version 1.0. (See accompanying file
8 // LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
9 //
10 // See http://www.boost.org/libs/interprocess for documentation.
11 //
12 //////////////////////////////////////////////////////////////////////////////
13 #include <boost/interprocess/detail/workaround.hpp>
14 #include <boost/interprocess/smart_ptr/enable_shared_from_this.hpp>
15 #include <boost/interprocess/smart_ptr/shared_ptr.hpp>
16
17 #include <boost/core/lightweight_test.hpp>
18 #include <boost/interprocess/managed_shared_memory.hpp>
19 #include "get_process_id_name.hpp"
20
21 //
22
23 using namespace boost::interprocess;
24
25 typedef allocator<void, managed_shared_memory::segment_manager>
26 v_allocator_t;
27
28 struct X;
29
30 typedef deleter<X, managed_shared_memory::segment_manager> x_deleter_t;
31
32 struct X :
33 public enable_shared_from_this<X, v_allocator_t, x_deleter_t>
34 {
35 };
36
37 typedef shared_ptr<X, v_allocator_t, x_deleter_t> v_shared_ptr;
38
39
40 template<class ManagedMemory>
41 void test_enable_shared_this(ManagedMemory &managed_mem)
42 {
43 v_shared_ptr p(make_managed_shared_ptr
44 (managed_mem.template construct<X>(anonymous_instance)(), managed_mem));
45
46 v_shared_ptr q = p->shared_from_this();
47 BOOST_TEST(p == q);
48 BOOST_TEST(!(p < q) && !(q < p));
49
50 X v2(*p);
51
52 try
53 {
54 //This should throw bad_weak_ptr
55 v_shared_ptr r = v2.shared_from_this();
56 BOOST_ERROR("v2.shared_from_this() failed to throw");
57 }
58 catch(boost::interprocess::bad_weak_ptr const &)
59 {
60 //This is the expected path
61 }
62 catch(...){
63 BOOST_ERROR("v2.shared_from_this() threw an unexpected exception");
64 }
65
66 try
67 {
68 //This should not throw bad_weak_ptr
69 *p = X();
70 v_shared_ptr r = p->shared_from_this();
71 BOOST_TEST(p == r);
72 BOOST_TEST(!(p < r) && !(r < p));
73 }
74 catch(boost::interprocess::bad_weak_ptr const &)
75 {
76 BOOST_ERROR("p->shared_from_this() threw bad_weak_ptr after *p = X()");
77 }
78 catch(...)
79 {
80 BOOST_ERROR("p->shared_from_this() threw an unexpected exception after *p = X()");
81 }
82 }
83
84
85 int main()
86 {
87 std::string process_name;
88 test::get_process_id_name(process_name);
89 shared_memory_object::remove(process_name.c_str());
90 managed_shared_memory shmem(create_only, process_name.c_str(), 65536);
91 test_enable_shared_this(shmem);
92 shared_memory_object::remove(process_name.c_str());
93 return boost::report_errors();
94 }