Skip to content

Commit 47d3012

Browse files
ClaytonKnittelcopybara-github
authored andcommitted
Add private variants of AddAllocated/ReleaseLast/ExtractSubrange that take the arena pointer as an argument.
This is an optimization for the future when `RepeatedPtrField`'s `GetArena()` method is more expensive, and it is cheaper for messages to pass these values down from above. PiperOrigin-RevId: 817906966
1 parent 668c52a commit 47d3012

File tree

1 file changed

+38
-4
lines changed

1 file changed

+38
-4
lines changed

src/google/protobuf/repeated_ptr_field.h

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1497,6 +1497,15 @@ class ABSL_ATTRIBUTE_WARN_UNUSED RepeatedPtrField final
14971497
#endif // !PROTOBUF_INTERNAL_REMOVE_ARENA_PTRS_REPEATED_PTR_FIELD
14981498

14991499

1500+
void AddAllocatedWithArena(Arena* arena, Element* value);
1501+
1502+
PROTOBUF_FUTURE_ADD_NODISCARD Element* ReleaseLastWithArena(Arena* arena);
1503+
1504+
void UnsafeArenaAddAllocatedWithArena(Arena* arena, Element* value);
1505+
1506+
void ExtractSubrangeWithArena(Arena* arena, int start, int num,
1507+
Element** elements);
1508+
15001509
void AddAllocatedForParse(Element* p, Arena* arena) {
15011510
return RepeatedPtrFieldBase::AddAllocatedForParse(p, arena);
15021511
}
@@ -1724,6 +1733,13 @@ inline void RepeatedPtrField<Element>::DeleteSubrange(int start, int num) {
17241733
template <typename Element>
17251734
inline void RepeatedPtrField<Element>::ExtractSubrange(int start, int num,
17261735
Element** elements) {
1736+
ExtractSubrangeWithArena(GetArena(), start, num, elements);
1737+
}
1738+
1739+
template <typename Element>
1740+
inline void RepeatedPtrField<Element>::ExtractSubrangeWithArena(
1741+
Arena* arena, int start, int num, Element** elements) {
1742+
ABSL_DCHECK_EQ(arena, GetArena());
17271743
ABSL_DCHECK_GE(start, 0);
17281744
ABSL_DCHECK_GE(num, 0);
17291745
ABSL_DCHECK_LE(start + num, size());
@@ -1734,7 +1750,6 @@ inline void RepeatedPtrField<Element>::ExtractSubrange(int start, int num,
17341750
<< "Releasing elements without transferring ownership is an unsafe "
17351751
"operation. Use UnsafeArenaExtractSubrange.";
17361752
if (elements != nullptr) {
1737-
Arena* arena = GetArena();
17381753
auto* extracted = data() + start;
17391754
if (internal::DebugHardenForceCopyInRelease()) {
17401755
// Always copy.
@@ -1874,17 +1889,36 @@ inline size_t RepeatedPtrField<Element>::SpaceUsedExcludingSelfLong() const {
18741889

18751890
template <typename Element>
18761891
inline void RepeatedPtrField<Element>::AddAllocated(Element* value) {
1877-
RepeatedPtrFieldBase::AddAllocated<TypeHandler>(GetArena(), value);
1892+
AddAllocatedWithArena(GetArena(), value);
1893+
}
1894+
1895+
template <typename Element>
1896+
inline void RepeatedPtrField<Element>::AddAllocatedWithArena(Arena* arena,
1897+
Element* value) {
1898+
ABSL_DCHECK_EQ(arena, GetArena());
1899+
RepeatedPtrFieldBase::AddAllocated<TypeHandler>(arena, value);
18781900
}
18791901

18801902
template <typename Element>
18811903
inline void RepeatedPtrField<Element>::UnsafeArenaAddAllocated(Element* value) {
1882-
RepeatedPtrFieldBase::UnsafeArenaAddAllocated<TypeHandler>(GetArena(), value);
1904+
UnsafeArenaAddAllocatedWithArena(GetArena(), value);
1905+
}
1906+
1907+
template <typename Element>
1908+
inline void RepeatedPtrField<Element>::UnsafeArenaAddAllocatedWithArena(
1909+
Arena* arena, Element* value) {
1910+
ABSL_DCHECK_EQ(arena, GetArena());
1911+
RepeatedPtrFieldBase::UnsafeArenaAddAllocated<TypeHandler>(arena, value);
18831912
}
18841913

18851914
template <typename Element>
18861915
inline Element* RepeatedPtrField<Element>::ReleaseLast() {
1887-
return RepeatedPtrFieldBase::ReleaseLast<TypeHandler>(GetArena());
1916+
return ReleaseLastWithArena(GetArena());
1917+
}
1918+
template <typename Element>
1919+
inline Element* RepeatedPtrField<Element>::ReleaseLastWithArena(Arena* arena) {
1920+
ABSL_DCHECK_EQ(arena, GetArena());
1921+
return RepeatedPtrFieldBase::ReleaseLast<TypeHandler>(arena);
18881922
}
18891923

18901924
template <typename Element>

0 commit comments

Comments
 (0)