annotate DEPENDENCIES/generic/include/boost/smart_ptr/detail/sp_counted_base_gcc_ppc.hpp @ 123:16b03aa90211 vext

Fix two paths
author Chris Cannam
date Fri, 29 Sep 2017 10:00:18 +0100
parents 2665513ce2d3
children
rev   line source
Chris@16 1 #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
Chris@16 2 #define BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED
Chris@16 3
Chris@16 4 // MS compatible compilers support #pragma once
Chris@16 5
Chris@16 6 #if defined(_MSC_VER) && (_MSC_VER >= 1020)
Chris@16 7 # pragma once
Chris@16 8 #endif
Chris@16 9
Chris@16 10 //
Chris@16 11 // detail/sp_counted_base_gcc_ppc.hpp - g++ on PowerPC
Chris@16 12 //
Chris@16 13 // Copyright (c) 2001, 2002, 2003 Peter Dimov and Multi Media Ltd.
Chris@16 14 // Copyright 2004-2005 Peter Dimov
Chris@16 15 //
Chris@16 16 // Distributed under the Boost Software License, Version 1.0. (See
Chris@16 17 // accompanying file LICENSE_1_0.txt or copy at
Chris@16 18 // http://www.boost.org/LICENSE_1_0.txt)
Chris@16 19 //
Chris@16 20 //
Chris@16 21 // Lock-free algorithm by Alexander Terekhov
Chris@16 22 //
Chris@16 23 // Thanks to Ben Hitchings for the #weak + (#shared != 0)
Chris@16 24 // formulation
Chris@16 25 //
Chris@16 26
Chris@16 27 #include <boost/detail/sp_typeinfo.hpp>
Chris@16 28
Chris@16 29 namespace boost
Chris@16 30 {
Chris@16 31
Chris@16 32 namespace detail
Chris@16 33 {
Chris@16 34
Chris@16 35 inline void atomic_increment( int * pw )
Chris@16 36 {
Chris@16 37 // ++*pw;
Chris@16 38
Chris@16 39 int tmp;
Chris@16 40
Chris@16 41 __asm__
Chris@16 42 (
Chris@16 43 "0:\n\t"
Chris@16 44 "lwarx %1, 0, %2\n\t"
Chris@16 45 "addi %1, %1, 1\n\t"
Chris@16 46 "stwcx. %1, 0, %2\n\t"
Chris@16 47 "bne- 0b":
Chris@16 48
Chris@16 49 "=m"( *pw ), "=&b"( tmp ):
Chris@16 50 "r"( pw ), "m"( *pw ):
Chris@16 51 "cc"
Chris@16 52 );
Chris@16 53 }
Chris@16 54
Chris@16 55 inline int atomic_decrement( int * pw )
Chris@16 56 {
Chris@16 57 // return --*pw;
Chris@16 58
Chris@16 59 int rv;
Chris@16 60
Chris@16 61 __asm__ __volatile__
Chris@16 62 (
Chris@16 63 "sync\n\t"
Chris@16 64 "0:\n\t"
Chris@16 65 "lwarx %1, 0, %2\n\t"
Chris@16 66 "addi %1, %1, -1\n\t"
Chris@16 67 "stwcx. %1, 0, %2\n\t"
Chris@16 68 "bne- 0b\n\t"
Chris@16 69 "isync":
Chris@16 70
Chris@16 71 "=m"( *pw ), "=&b"( rv ):
Chris@16 72 "r"( pw ), "m"( *pw ):
Chris@16 73 "memory", "cc"
Chris@16 74 );
Chris@16 75
Chris@16 76 return rv;
Chris@16 77 }
Chris@16 78
Chris@16 79 inline int atomic_conditional_increment( int * pw )
Chris@16 80 {
Chris@16 81 // if( *pw != 0 ) ++*pw;
Chris@16 82 // return *pw;
Chris@16 83
Chris@16 84 int rv;
Chris@16 85
Chris@16 86 __asm__
Chris@16 87 (
Chris@16 88 "0:\n\t"
Chris@16 89 "lwarx %1, 0, %2\n\t"
Chris@16 90 "cmpwi %1, 0\n\t"
Chris@16 91 "beq 1f\n\t"
Chris@16 92 "addi %1, %1, 1\n\t"
Chris@16 93 "1:\n\t"
Chris@16 94 "stwcx. %1, 0, %2\n\t"
Chris@16 95 "bne- 0b":
Chris@16 96
Chris@16 97 "=m"( *pw ), "=&b"( rv ):
Chris@16 98 "r"( pw ), "m"( *pw ):
Chris@16 99 "cc"
Chris@16 100 );
Chris@16 101
Chris@16 102 return rv;
Chris@16 103 }
Chris@16 104
Chris@16 105 class sp_counted_base
Chris@16 106 {
Chris@16 107 private:
Chris@16 108
Chris@16 109 sp_counted_base( sp_counted_base const & );
Chris@16 110 sp_counted_base & operator= ( sp_counted_base const & );
Chris@16 111
Chris@16 112 int use_count_; // #shared
Chris@16 113 int weak_count_; // #weak + (#shared != 0)
Chris@16 114
Chris@16 115 public:
Chris@16 116
Chris@16 117 sp_counted_base(): use_count_( 1 ), weak_count_( 1 )
Chris@16 118 {
Chris@16 119 }
Chris@16 120
Chris@16 121 virtual ~sp_counted_base() // nothrow
Chris@16 122 {
Chris@16 123 }
Chris@16 124
Chris@16 125 // dispose() is called when use_count_ drops to zero, to release
Chris@16 126 // the resources managed by *this.
Chris@16 127
Chris@16 128 virtual void dispose() = 0; // nothrow
Chris@16 129
Chris@16 130 // destroy() is called when weak_count_ drops to zero.
Chris@16 131
Chris@16 132 virtual void destroy() // nothrow
Chris@16 133 {
Chris@16 134 delete this;
Chris@16 135 }
Chris@16 136
Chris@16 137 virtual void * get_deleter( sp_typeinfo const & ti ) = 0;
Chris@16 138 virtual void * get_untyped_deleter() = 0;
Chris@16 139
Chris@16 140 void add_ref_copy()
Chris@16 141 {
Chris@16 142 atomic_increment( &use_count_ );
Chris@16 143 }
Chris@16 144
Chris@16 145 bool add_ref_lock() // true on success
Chris@16 146 {
Chris@16 147 return atomic_conditional_increment( &use_count_ ) != 0;
Chris@16 148 }
Chris@16 149
Chris@16 150 void release() // nothrow
Chris@16 151 {
Chris@16 152 if( atomic_decrement( &use_count_ ) == 0 )
Chris@16 153 {
Chris@16 154 dispose();
Chris@16 155 weak_release();
Chris@16 156 }
Chris@16 157 }
Chris@16 158
Chris@16 159 void weak_add_ref() // nothrow
Chris@16 160 {
Chris@16 161 atomic_increment( &weak_count_ );
Chris@16 162 }
Chris@16 163
Chris@16 164 void weak_release() // nothrow
Chris@16 165 {
Chris@16 166 if( atomic_decrement( &weak_count_ ) == 0 )
Chris@16 167 {
Chris@16 168 destroy();
Chris@16 169 }
Chris@16 170 }
Chris@16 171
Chris@16 172 long use_count() const // nothrow
Chris@16 173 {
Chris@16 174 return static_cast<int const volatile &>( use_count_ );
Chris@16 175 }
Chris@16 176 };
Chris@16 177
Chris@16 178 } // namespace detail
Chris@16 179
Chris@16 180 } // namespace boost
Chris@16 181
Chris@16 182 #endif // #ifndef BOOST_SMART_PTR_DETAIL_SP_COUNTED_BASE_GCC_PPC_HPP_INCLUDED