Skip to content
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
21 changes: 5 additions & 16 deletions src/google/protobuf/generated_message_tctable_decl.h
Original file line number Diff line number Diff line change
Expand Up @@ -334,7 +334,7 @@ struct alignas(uint64_t) TcParseTableBase {
// Table entry for fast-path tailcall dispatch handling.
struct FastFieldEntry {
// Target function for dispatch:
mutable std::atomic<TailCallParseFunc> target_atomic;
TailCallParseFunc target_function;

// Field data used during parse:
TcFieldData bits;
Expand All @@ -344,25 +344,14 @@ struct alignas(uint64_t) TcParseTableBase {

// Constant initializes this instance
constexpr FastFieldEntry(TailCallParseFunc func, TcFieldData bits)
: target_atomic(func), bits(bits) {}
: target_function(func), bits(bits) {}

// FastFieldEntry is copy-able and assignable, which is intended
// mainly for testing and debugging purposes.
FastFieldEntry(const FastFieldEntry& rhs) noexcept
: FastFieldEntry(rhs.target(), rhs.bits) {}
FastFieldEntry& operator=(const FastFieldEntry& rhs) noexcept {
SetTarget(rhs.target());
bits = rhs.bits;
return *this;
}
FastFieldEntry(const FastFieldEntry& rhs) noexcept = default;
FastFieldEntry& operator=(const FastFieldEntry& rhs) noexcept = default;

// Protocol buffer code should use these relaxed accessors.
TailCallParseFunc target() const {
return target_atomic.load(std::memory_order_relaxed);
}
void SetTarget(TailCallParseFunc func) const {
return target_atomic.store(func, std::memory_order_relaxed);
}
TailCallParseFunc target() const { return target_function; }
};
// There is always at least one table entry.
const FastFieldEntry* fast_entry(size_t idx) const {
Expand Down
Loading