Coverage Report

Created: 2023-11-12 09:30

/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