/proc/self/cwd/source/common/common/cleanup.h
Line | Count | Source (jump to first uncovered line) |
1 | | #pragma once |
2 | | |
3 | | #include <functional> |
4 | | #include <list> |
5 | | |
6 | | #include "source/common/common/assert.h" |
7 | | |
8 | | namespace Envoy { |
9 | | |
10 | | // RAII cleanup via functor. |
11 | | class Cleanup { |
12 | | public: |
13 | 965k | Cleanup(std::function<void()> f) : f_(std::move(f)) {} |
14 | 965k | ~Cleanup() { f_(); } |
15 | | |
16 | 0 | void cancel() { |
17 | 0 | cancelled_ = true; |
18 | 0 | f_ = []() {}; |
19 | 0 | } |
20 | | |
21 | 0 | bool cancelled() { return cancelled_; } |
22 | | |
23 | | private: |
24 | | std::function<void()> f_; |
25 | | bool cancelled_{false}; |
26 | | }; |
27 | | |
28 | | // RAII helper class to add an element to an std::list on construction and erase |
29 | | // it on destruction, unless the cancel method has been called. |
30 | | template <class T> class RaiiListElement { |
31 | | public: |
32 | 7.78k | RaiiListElement(std::list<T>& container, T element) : container_(container) { |
33 | 7.78k | it_ = container.emplace(container.begin(), element); |
34 | 7.78k | } Unexecuted instantiation: Envoy::RaiiListElement<std::__1::function<void ()> >::RaiiListElement(std::__1::list<std::__1::function<void ()>, std::__1::allocator<std::__1::function<void ()> > >&, std::__1::function<void ()>) Unexecuted instantiation: Envoy::RaiiListElement<std::__1::function<void (absl::AnyInvocable<void ()>)> >::RaiiListElement(std::__1::list<std::__1::function<void (absl::AnyInvocable<void ()>)>, std::__1::allocator<std::__1::function<void (absl::AnyInvocable<void ()>)> > >&, std::__1::function<void (absl::AnyInvocable<void ()>)>) Envoy::RaiiListElement<Envoy::Upstream::ClusterUpdateCallbacks*>::RaiiListElement(std::__1::list<Envoy::Upstream::ClusterUpdateCallbacks*, std::__1::allocator<Envoy::Upstream::ClusterUpdateCallbacks*> >&, Envoy::Upstream::ClusterUpdateCallbacks*) Line | Count | Source | 32 | 7.78k | RaiiListElement(std::list<T>& container, T element) : container_(container) { | 33 | 7.78k | it_ = container.emplace(container.begin(), element); | 34 | 7.78k | } |
Unexecuted instantiation: Envoy::RaiiListElement<Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::AddUpdateCallbacksHandleImpl*>::RaiiListElement(std::__1::list<Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::AddUpdateCallbacksHandleImpl*, std::__1::allocator<Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::AddUpdateCallbacksHandleImpl*> >&, Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::AddUpdateCallbacksHandleImpl*) |
35 | 7.78k | virtual ~RaiiListElement() { |
36 | 7.78k | if (!cancelled_) { |
37 | 7.78k | erase(); |
38 | 7.78k | } |
39 | 7.78k | } Unexecuted instantiation: Envoy::RaiiListElement<std::__1::function<void ()> >::~RaiiListElement() Unexecuted instantiation: Envoy::RaiiListElement<std::__1::function<void (absl::AnyInvocable<void ()>)> >::~RaiiListElement() Envoy::RaiiListElement<Envoy::Upstream::ClusterUpdateCallbacks*>::~RaiiListElement() Line | Count | Source | 35 | 7.78k | virtual ~RaiiListElement() { | 36 | 7.78k | if (!cancelled_) { | 37 | 7.78k | erase(); | 38 | 7.78k | } | 39 | 7.78k | } |
Unexecuted instantiation: Envoy::RaiiListElement<Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::AddUpdateCallbacksHandleImpl*>::~RaiiListElement() |
40 | | |
41 | | // Cancel deletion of the element on destruction. This should be called if the iterator has |
42 | | // been invalidated, e.g., if the list has been cleared or the element removed some other way. |
43 | 0 | void cancel() { cancelled_ = true; } |
44 | | |
45 | | // Delete the element now, instead of at destruction. |
46 | 7.78k | void erase() { |
47 | 7.78k | ASSERT(!cancelled_); |
48 | 7.78k | container_.erase(it_); |
49 | 7.78k | cancelled_ = true; |
50 | 7.78k | } Unexecuted instantiation: Envoy::RaiiListElement<std::__1::function<void ()> >::erase() Unexecuted instantiation: Envoy::RaiiListElement<std::__1::function<void (absl::AnyInvocable<void ()>)> >::erase() Envoy::RaiiListElement<Envoy::Upstream::ClusterUpdateCallbacks*>::erase() Line | Count | Source | 46 | 7.78k | void erase() { | 47 | 7.78k | ASSERT(!cancelled_); | 48 | 7.78k | container_.erase(it_); | 49 | 7.78k | cancelled_ = true; | 50 | 7.78k | } |
Unexecuted instantiation: Envoy::RaiiListElement<Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::AddUpdateCallbacksHandleImpl*>::erase() |
51 | | |
52 | | private: |
53 | | std::list<T>& container_; |
54 | | typename std::list<T>::iterator it_; |
55 | | bool cancelled_{false}; |
56 | | }; |
57 | | |
58 | | // RAII helper class to add an element to a std::list held inside an absl::flat_hash_map on |
59 | | // construction and erase it on destruction, unless the cancel method has been called. If the list |
60 | | // is empty after removal of the element, the destructor will also remove the list from the map. |
61 | | template <class Key, class Value> class RaiiMapOfListElement { |
62 | | public: |
63 | | using MapOfList = absl::flat_hash_map<Key, std::list<Value>>; |
64 | | |
65 | | template <typename ConvertibleToKey> |
66 | | RaiiMapOfListElement(MapOfList& map, const ConvertibleToKey& key, Value value) |
67 | 0 | : map_(map), key_(key) { |
68 | | // The list reference itself cannot be saved because it is not stable in the event of a |
69 | | // absl::flat_hash_map rehash. |
70 | 0 | std::list<Value>& list = map_.try_emplace(key).first->second; |
71 | 0 | it_ = list.emplace(list.begin(), value); |
72 | 0 | } Unexecuted instantiation: Envoy::RaiiMapOfListElement<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, Envoy::Extensions::HttpFilters::DynamicForwardProxy::ProxyFilterConfig::LoadClusterEntryHandleImpl*>::RaiiMapOfListElement<std::__1::basic_string_view<char, std::__1::char_traits<char> > >(absl::flat_hash_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::list<Envoy::Extensions::HttpFilters::DynamicForwardProxy::ProxyFilterConfig::LoadClusterEntryHandleImpl*, std::__1::allocator<Envoy::Extensions::HttpFilters::DynamicForwardProxy::ProxyFilterConfig::LoadClusterEntryHandleImpl*> >, absl::container_internal::StringHash, absl::container_internal::StringEq, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::list<Envoy::Extensions::HttpFilters::DynamicForwardProxy::ProxyFilterConfig::LoadClusterEntryHandleImpl*, std::__1::allocator<Envoy::Extensions::HttpFilters::DynamicForwardProxy::ProxyFilterConfig::LoadClusterEntryHandleImpl*> > > > >&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, Envoy::Extensions::HttpFilters::DynamicForwardProxy::ProxyFilterConfig::LoadClusterEntryHandleImpl*) Unexecuted instantiation: Envoy::RaiiMapOfListElement<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::LoadDnsCacheEntryHandleImpl*>::RaiiMapOfListElement<std::__1::basic_string_view<char, std::__1::char_traits<char> > >(absl::flat_hash_map<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::list<Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::LoadDnsCacheEntryHandleImpl*, std::__1::allocator<Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::LoadDnsCacheEntryHandleImpl*> >, absl::container_internal::StringHash, absl::container_internal::StringEq, std::__1::allocator<std::__1::pair<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const, std::__1::list<Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::LoadDnsCacheEntryHandleImpl*, std::__1::allocator<Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::LoadDnsCacheEntryHandleImpl*> > > > >&, std::__1::basic_string_view<char, std::__1::char_traits<char> > const&, Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::LoadDnsCacheEntryHandleImpl*) |
73 | | |
74 | 0 | virtual ~RaiiMapOfListElement() { |
75 | 0 | if (!cancelled_) { |
76 | 0 | erase(); |
77 | 0 | } |
78 | 0 | } Unexecuted instantiation: Envoy::RaiiMapOfListElement<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, Envoy::Extensions::HttpFilters::DynamicForwardProxy::ProxyFilterConfig::LoadClusterEntryHandleImpl*>::~RaiiMapOfListElement() Unexecuted instantiation: Envoy::RaiiMapOfListElement<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::LoadDnsCacheEntryHandleImpl*>::~RaiiMapOfListElement() |
79 | | |
80 | 0 | void cancel() { cancelled_ = true; }Unexecuted instantiation: Envoy::RaiiMapOfListElement<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, Envoy::Extensions::HttpFilters::DynamicForwardProxy::ProxyFilterConfig::LoadClusterEntryHandleImpl*>::cancel() Unexecuted instantiation: Envoy::RaiiMapOfListElement<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::LoadDnsCacheEntryHandleImpl*>::cancel() |
81 | | |
82 | | private: |
83 | 0 | void erase() { |
84 | 0 | ASSERT(!cancelled_); |
85 | 0 | auto list_it = map_.find(key_); |
86 | 0 | ASSERT(list_it != map_.end()); |
87 | | |
88 | 0 | list_it->second.erase(it_); |
89 | 0 | if (list_it->second.empty()) { |
90 | 0 | map_.erase(key_); |
91 | 0 | } |
92 | 0 | cancelled_ = true; |
93 | 0 | } Unexecuted instantiation: Envoy::RaiiMapOfListElement<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, Envoy::Extensions::HttpFilters::DynamicForwardProxy::ProxyFilterConfig::LoadClusterEntryHandleImpl*>::erase() Unexecuted instantiation: Envoy::RaiiMapOfListElement<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, Envoy::Extensions::Common::DynamicForwardProxy::DnsCacheImpl::LoadDnsCacheEntryHandleImpl*>::erase() |
94 | | |
95 | | MapOfList& map_; |
96 | | // Because of absl::flat_hash_map iterator instability we have to keep a copy of the key. |
97 | | const Key key_; |
98 | | typename MapOfList::mapped_type::iterator it_; |
99 | | bool cancelled_{false}; |
100 | | }; |
101 | | } // namespace Envoy |