18#include <unordered_map>
35 static_assert(
noexcept(std::declval<Visit &>()(
false,
false)));
36 static_assert(std::is_nothrow_move_constructible_v<Visit> && std::is_nothrow_move_assignable_v<Visit>);
48 auto found =
pairs_.find(
id.index.hex());
49 if (found ==
pairs_.end())
return {};
50 if (found->second.value->mapped()->identity() !=
id)
51 throw std::invalid_argument(
"checkpoint index has another native identity");
52 return found->second.value;
55 auto found =
natives_.find(
id.hex());
64 bool replace(std::vector<pair_type> pairs, std::vector<native_root> natives) {
65 std::size_t p = 0, n = 0;
66 auto rollback = [&]()
noexcept {
68 while (p)
release_pair(pairs[--p]->mapped()->identity());
71 for (; p != pairs.size(); ++p)
if (!
acquire_pair(pairs[p])) { rollback();
return false; }
72 for (; n != natives.size(); ++n)
if (!
acquire_native(natives[n].first, natives[n].second)) { rollback();
return false; }
73 }
catch (...) { rollback();
throw; }
90 std::unordered_map<std::string, entry<pair_type>>
pairs_;
91 std::unordered_map<std::string, entry<native_pointer>>
natives_;
95 template <
class Map>
static void trim(Map & map)
noexcept {
98 if (map.bucket_count() > 64 && map.size() < map.bucket_count() / 4) {
99 try { map.rehash(map.size() * 2 + 1); }
100 catch (std::bad_alloc
const &) {}
110 if (found->second.value != value)
return false;
111 ++found->second.references;
112 }
else visit_(
false,
true);
116 auto const &
id = value->mapped()->identity();
119 if (found->second.value != value || found->second.value->mapped()->identity() !=
id)
return false;
120 ++found->second.references;
return true;
124 auto main = value->main_target();
auto secondary = value->secondary_target();
125 bool native_live =
false, main_live =
false, secondary_live =
false;
126 auto rollback = [&]()
noexcept {
127 pairs_.erase(
id.index.hex());
128 if (secondary_live)
release_native(*value->mapped()->index_object()->secondary_id());
134 if (!native_live) { rollback();
return false; }
137 rollback();
return false;
139 }
catch (...) { rollback();
throw; }
140 visit_(
true,
true);
return true;
143 auto found =
natives_.find(
id.hex());
144 if (!--found->second.references) {
natives_.erase(found);
visit_(
false,
false); }
147 auto found =
pairs_.find(
id.index.hex());
148 if (--found->second.references)
return;
149 auto value = std::move(found->second.value);
151 if (
auto secondary = value->secondary_target())
Definition runtime_checkpoint.h:23
Encodes portable blob sections and retains mmap-backed profile directories.
Definition object_path.h:38
Definition runtime_registry.h:23
void operator()(bool, bool) const noexcept
Definition runtime_registry.h:24
Definition runtime_registry.h:89
T value
Definition runtime_registry.h:89
std::size_t references
Definition runtime_registry.h:89
Definition runtime_registry.h:30
void clear() noexcept
Definition runtime_registry.h:80
runtime_registry(runtime_registry &&other) noexcept
Definition runtime_registry.h:40
std::vector< pair_type > pair_roots_
Definition runtime_registry.h:92
void release_pair(blob_identity const &id) noexcept
Definition runtime_registry.h:146
runtime_registry & operator=(runtime_registry &&other) noexcept
Definition runtime_registry.h:41
typename Node::pair_type pair_type
Definition runtime_registry.h:31
std::size_t pair_count() const noexcept
Definition runtime_registry.h:58
native_pointer native(object_id const &id) const
Definition runtime_registry.h:54
pair_type pair(blob_identity const &id) const
Definition runtime_registry.h:47
runtime_registry(runtime_registry const &)=delete
typename Node::native_pointer native_pointer
Definition runtime_registry.h:32
static void trim(Map &map) noexcept
Definition runtime_registry.h:95
std::pair< object_id, native_pointer > native_root
Definition runtime_registry.h:33
void release_native(object_id const &id) noexcept
Definition runtime_registry.h:142
std::unordered_map< std::string, entry< pair_type > > pairs_
Definition runtime_registry.h:90
Visit visit_
Definition runtime_registry.h:94
std::unordered_map< std::string, entry< native_pointer > > natives_
Definition runtime_registry.h:91
bool acquire_native(object_id const &id, native_pointer const &value)
Definition runtime_registry.h:107
~runtime_registry()
Definition runtime_registry.h:45
runtime_registry & operator=(runtime_registry const &)=delete
bool acquire_pair(pair_type const &value)
Definition runtime_registry.h:115
std::size_t native_count() const noexcept
Definition runtime_registry.h:59
std::vector< native_root > native_roots_
Definition runtime_registry.h:93
runtime_registry(Visit visit={})
Definition runtime_registry.h:34
void swap_roots(runtime_registry &other) noexcept
Definition runtime_registry.h:103
bool replace(std::vector< pair_type > pairs, std::vector< native_root > natives)
Definition runtime_registry.h:64