|
| 1 | +// Auto-generated by {{ generator }}, do not modify. |
| 2 | +#include <ydb/core/base/generated/runtime_feature_flags.h> |
| 3 | +#include <ydb/core/protos/feature_flags.pb.h> |
| 4 | + |
| 5 | +namespace NKikimr { |
| 6 | + |
| 7 | +{% for slot in slots %} |
| 8 | +std::tuple<ui64, ui64> TRuntimeFeatureFlags::BitsFromProto_{{ slot.name }}(const NKikimrConfig::TFeatureFlags& flags) { |
| 9 | + ui64 bits = 0; |
| 10 | + ui64 mask = 0; |
| 11 | +{%- for field in slot.fields %} |
| 12 | + if (flags.Has{{ field.name }}()) { |
| 13 | + bits |= flags.Get{{ field.name }}() ? {{ field.full_mask }}ULL : {{ field.has_mask }}ULL; |
| 14 | + mask |= {{ field.full_mask }}ULL; |
| 15 | + } |
| 16 | +{%- endfor %} |
| 17 | + return { bits, mask }; |
| 18 | +} |
| 19 | + |
| 20 | +ui64 TRuntimeFeatureFlags::FromProto_{{ slot.name }}(const NKikimrConfig::TFeatureFlags& flags, ui64 value) { |
| 21 | + auto [bits, mask] = BitsFromProto_{{ slot.name }}(flags); |
| 22 | + return (value & ~mask) | bits; |
| 23 | +} |
| 24 | + |
| 25 | +void TRuntimeFeatureFlags::Update_{{ slot.name }}(ui64 bits, ui64 mask) { |
| 26 | + ui64 slot = {{ slot.name }}_.load(std::memory_order_relaxed); |
| 27 | + for (;;) { |
| 28 | + ui64 updated = (slot & ~mask) | bits; |
| 29 | + // We perform a CAS so unrelated updates by concurrent threads are not lost |
| 30 | + if ({{ slot.name }}_.compare_exchange_weak(slot, updated, std::memory_order_relaxed)) { |
| 31 | + break; |
| 32 | + } |
| 33 | + } |
| 34 | +} |
| 35 | +{% endfor %} |
| 36 | + |
| 37 | +TRuntimeFeatureFlags::TRuntimeFeatureFlags() |
| 38 | +{%- for slot in slots %} |
| 39 | + {{ ',' if slot.index else ':' }} {{ slot.name }}_{ {{ slot.default_value }}ULL } |
| 40 | +{%- endfor %} |
| 41 | +{} |
| 42 | + |
| 43 | +TRuntimeFeatureFlags::TRuntimeFeatureFlags(const TRuntimeFeatureFlags& flags) |
| 44 | +{%- for slot in slots %} |
| 45 | + {{ ',' if slot.index else ':' }} {{ slot.name }}_{ flags.{{ slot.name }}_.load(std::memory_order_relaxed) } |
| 46 | +{%- endfor %} |
| 47 | +{} |
| 48 | + |
| 49 | +TRuntimeFeatureFlags& TRuntimeFeatureFlags::operator=(const TRuntimeFeatureFlags& flags) { |
| 50 | +{%- for slot in slots %} |
| 51 | + {{ slot.name }}_.store( |
| 52 | + flags.{{ slot.name }}_.load(std::memory_order_relaxed), |
| 53 | + std::memory_order_relaxed); |
| 54 | +{%- endfor %} |
| 55 | + return *this; |
| 56 | +} |
| 57 | + |
| 58 | +TRuntimeFeatureFlags::TRuntimeFeatureFlags(const NKikimrConfig::TFeatureFlags& flags) |
| 59 | +{%- for slot in slots %} |
| 60 | + {{ ',' if slot.index else ':' }} {{ slot.name }}_{ FromProto_{{ slot.name }}(flags, {{ slot.default_value }}ULL) } |
| 61 | +{%- endfor %} |
| 62 | +{} |
| 63 | + |
| 64 | +TRuntimeFeatureFlags& TRuntimeFeatureFlags::operator=(const NKikimrConfig::TFeatureFlags& flags) { |
| 65 | + CopyFrom(flags); |
| 66 | + return *this; |
| 67 | +} |
| 68 | + |
| 69 | +void TRuntimeFeatureFlags::CopyFrom(const NKikimrConfig::TFeatureFlags& flags) { |
| 70 | +{%- for slot in slots %} |
| 71 | + ui64 {{ slot.name }} = FromProto_{{ slot.name }}(flags, {{ slot.default_value }}ULL); |
| 72 | +{%- endfor %} |
| 73 | +{%- for slot in slots %} |
| 74 | + {{ slot.name }}_.store({{ slot.name }}, std::memory_order_relaxed); |
| 75 | +{%- endfor %} |
| 76 | +} |
| 77 | + |
| 78 | +void TRuntimeFeatureFlags::MergeFrom(const NKikimrConfig::TFeatureFlags& flags) { |
| 79 | +{%- for slot in slots %} |
| 80 | + auto [{{ slot.name }}_bits, {{ slot.name }}_mask] = BitsFromProto_{{ slot.name }}(flags); |
| 81 | +{%- endfor %} |
| 82 | +{%- for slot in slots %} |
| 83 | + Update_{{ slot.name }}({{ slot.name }}_bits, {{ slot.name }}_mask); |
| 84 | +{%- endfor %} |
| 85 | +} |
| 86 | + |
| 87 | +void TRuntimeFeatureFlags::CopyRuntimeFrom(const NKikimrConfig::TFeatureFlags& flags) { |
| 88 | +{%- for slot in slots %} |
| 89 | + ui64 {{ slot.name }} = FromProto_{{ slot.name }}(flags, {{ slot.default_value }}ULL); |
| 90 | +{%- endfor %} |
| 91 | +{%- for slot in slots %} |
| 92 | + Update_{{ slot.name }}({{ slot.name }} & {{ slot.runtime_flags_mask }}ULL, {{ slot.runtime_flags_mask }}ULL); |
| 93 | +{%- endfor %} |
| 94 | +} |
| 95 | + |
| 96 | +TRuntimeFeatureFlags::operator NKikimrConfig::TFeatureFlags() const { |
| 97 | + NKikimrConfig::TFeatureFlags flags; |
| 98 | +{%- for slot in slots %} |
| 99 | + ui64 {{ slot.name }} = {{ slot.name }}_.load(std::memory_order_relaxed); |
| 100 | +{%- endfor %} |
| 101 | +{%- for field in fields %} |
| 102 | + if ({{ field.slot.name }} & {{ field.has_mask }}ULL) { |
| 103 | + flags.Set{{ field.name }}(bool({{ field.slot.name }} & {{ field.value_mask }}ULL)); |
| 104 | + } |
| 105 | +{%- endfor %} |
| 106 | + return flags; |
| 107 | +} |
| 108 | + |
| 109 | +{% for field in fields %} |
| 110 | +bool TRuntimeFeatureFlags::Has{{ field.name }}() const { |
| 111 | + return {{ field.slot.name }}_.load(std::memory_order_relaxed) & {{ field.has_mask }}ULL; |
| 112 | +} |
| 113 | + |
| 114 | +bool TRuntimeFeatureFlags::Get{{ field.name }}() const { |
| 115 | + return {{ field.slot.name }}_.load(std::memory_order_relaxed) & {{ field.value_mask }}ULL; |
| 116 | +} |
| 117 | + |
| 118 | +void TRuntimeFeatureFlags::Set{{ field.name }}(bool value) { |
| 119 | + Update_{{ field.slot.name }}(value ? {{ field.full_mask }}ULL : {{ field.has_mask }}ULL, {{ field.full_mask}}ULL); |
| 120 | +} |
| 121 | + |
| 122 | +void TRuntimeFeatureFlags::Clear{{ field.name }}() { |
| 123 | + Update_{{ field.slot.name }}({{ field.default_value }}ULL, {{ field.full_mask }}ULL); |
| 124 | +} |
| 125 | +{% endfor %} |
| 126 | + |
| 127 | +} // namespace NKikimr |
0 commit comments