]> git.proxmox.com Git - ceph.git/blame - ceph/src/boost/libs/interprocess/test/enable_shared_from_this_test.cpp
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / boost / libs / interprocess / test / enable_shared_from_this_test.cpp
CommitLineData
7c673cae
FG
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//////////////////////////////////////////////////////////////////////////////
7c673cae
FG
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
23using namespace boost::interprocess;
24
25typedef allocator<void, managed_shared_memory::segment_manager>
26 v_allocator_t;
27
28struct X;
29
30typedef deleter<X, managed_shared_memory::segment_manager> x_deleter_t;
31
32struct X :
33 public enable_shared_from_this<X, v_allocator_t, x_deleter_t>
34{
35};
36
37typedef shared_ptr<X, v_allocator_t, x_deleter_t> v_shared_ptr;
38
39
40template<class ManagedMemory>
41void 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
1e59de90 52 BOOST_TRY
7c673cae
FG
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 }
1e59de90 58 BOOST_CATCH(boost::interprocess::bad_weak_ptr const &)
7c673cae
FG
59 {
60 //This is the expected path
61 }
1e59de90 62 BOOST_CATCH(...){
7c673cae 63 BOOST_ERROR("v2.shared_from_this() threw an unexpected exception");
1e59de90 64 } BOOST_CATCH_END
7c673cae 65
1e59de90 66 BOOST_TRY
7c673cae
FG
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 }
1e59de90 74 BOOST_CATCH(boost::interprocess::bad_weak_ptr const &)
7c673cae
FG
75 {
76 BOOST_ERROR("p->shared_from_this() threw bad_weak_ptr after *p = X()");
77 }
1e59de90 78 BOOST_CATCH(...)
7c673cae
FG
79 {
80 BOOST_ERROR("p->shared_from_this() threw an unexpected exception after *p = X()");
1e59de90 81 } BOOST_CATCH_END
7c673cae
FG
82}
83
84
85int 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}