31 #ifndef GOOGLE_PROTOBUF_ARENA_H__ 32 #define GOOGLE_PROTOBUF_ARENA_H__ 36 #undef max // Visual Studio defines this macro 38 #if __cplusplus >= 201103L 41 #if defined(_MSC_VER) && !_HAS_EXCEPTIONS 46 using type_info = ::type_info;
70 template<
typename Type>
78 delete reinterpret_cast<T*
>(
object);
128 void* (*on_arena_init)(
Arena* arena);
137 void (*on_arena_allocation)(
const std::type_info* allocated_type,
138 uint64 alloc_size,
void* cookie);
141 : start_block_size(kDefaultStartBlockSize),
142 max_block_size(kDefaultMaxBlockSize),
144 initial_block_size(0),
148 on_arena_reset(
NULL),
149 on_arena_destruction(
NULL),
150 on_arena_allocation(
NULL) {}
155 static const size_t kDefaultStartBlockSize = 256;
156 static const size_t kDefaultMaxBlockSize = 8192;
161 #ifndef GOOGLE_PROTOBUF_NO_RTTI 162 #define RTTI_TYPE_ID(type) (&typeid(type)) 164 #define RTTI_TYPE_ID(type) (NULL) 215 #if __cplusplus >= 201103L 264 return new T(
NULL, arg);
279 return new T(
NULL, arg1, arg2);
325 return new T(arg1, arg2);
334 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3>
336 const Arg1& arg1,
const Arg2& arg2,
339 return new T(arg1, arg2, arg3);
348 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
351 const Arg1& arg1,
const Arg2& arg2,
352 const Arg3&
arg3,
const Arg4&
arg4) {
354 return new T(arg1, arg2, arg3, arg4);
363 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
364 typename Arg4,
typename Arg5>
366 const Arg1& arg1,
const Arg2& arg2,
370 return new T(arg1, arg2, arg3, arg4, arg5);
379 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
380 typename Arg4,
typename Arg5,
typename Arg6>
382 const Arg1& arg1,
const Arg2& arg2,
384 const Arg5& arg5,
const Arg6& arg6) {
386 return new T(arg1, arg2, arg3, arg4, arg5, arg6);
389 arg1, arg2,
arg3,
arg4, arg5, arg6);
395 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
396 typename Arg4,
typename Arg5,
typename Arg6,
typename Arg7>
398 const Arg1& arg1,
const Arg2& arg2,
400 const Arg5& arg5,
const Arg6& arg6,
403 return new T(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
406 arg1, arg2,
arg3,
arg4, arg5, arg6, arg7);
412 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
413 typename Arg4,
typename Arg5,
typename Arg6,
typename Arg7,
416 const Arg1& arg1,
const Arg2& arg2,
418 const Arg5& arg5,
const Arg6& arg6,
419 const Arg7& arg7,
const Arg8& arg8) {
421 return new T(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
425 arg1, arg2,
arg3,
arg4, arg5, arg6, arg7, arg8);
439 <<
"Requested size is too large to fit into size_t.";
441 return static_cast<T*
>(::operator
new[](num_elements *
sizeof(
T)));
480 if (
object !=
NULL) {
481 AddListNode(
object, &internal::arena_destruct_object<T>);
490 void (*destruct)(
void*)) {
491 AddListNode(
object, destruct);
500 return GetArenaInternal(value, static_cast<T*>(0));
504 struct InternalIsArenaConstructableHelper {
506 static char ArenaConstructable(
507 const typename U::InternalArenaConstructable_*);
509 static double ArenaConstructable(...);
520 template <
typename T>
523 bool, sizeof(InternalIsArenaConstructableHelper::ArenaConstructable<
524 const T>(static_cast<const T*>(0))) == sizeof(char)> {
542 template<
typename Type>
friend class ::google::protobuf::internal::GenericTypeHandler;
543 friend class MockArena;
544 friend class internal::ArenaString;
545 friend class internal::LazyField;
550 int64 last_lifecycle_id_seen;
551 Block* last_block_used_;
554 static const size_t kHeaderSize =
sizeof(Block);
556 #if defined(GOOGLE_PROTOBUF_NO_THREADLOCAL) 560 static ThreadCache& thread_cache();
561 #elif defined(PROTOBUF_USE_DLLS) 564 static ThreadCache& thread_cache();
567 static ThreadCache& thread_cache() {
return thread_cache_; }
575 static inline bool SkipDeleteList(
typename T::DestructorSkippable_*) {
582 static inline bool SkipDeleteList(...) {
587 struct InternalIsDestructorSkippableHelper {
589 static char DestructorSkippable(
590 const typename U::DestructorSkippable_*);
592 static double DestructorSkippable(...);
607 sizeof(InternalIsDestructorSkippableHelper::DestructorSkippable<
608 const T>(static_cast<const T*>(0))) == sizeof(char) ||
609 google::protobuf::internal::has_trivial_destructor<T>::value> {};
618 Arena* arena,
typename Msg::InternalArenaConstructable_*) {
619 return CreateMessage<Msg>(arena);
624 return Create<T>(arena);
633 <<
"Requested size is too large to fit into size_t.";
634 return static_cast<T*
>(
635 AllocateAligned(
RTTI_TYPE_ID(T),
sizeof(T) * num_elements));
641 if (!skip_explicit_ownership) {
642 AddListNode(t, &internal::arena_destruct_object<T>);
650 if (!skip_explicit_ownership) {
651 AddListNode(t, &internal::arena_destruct_object<T>);
658 bool skip_explicit_ownership,
const Arg1& arg1,
const Arg2& arg2) {
659 T*
t =
new (AllocateAligned(
RTTI_TYPE_ID(T),
sizeof(T)))
T(arg1, arg2);
660 if (!skip_explicit_ownership) {
661 AddListNode(t, &internal::arena_destruct_object<T>);
666 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3>
673 if (!skip_explicit_ownership) {
674 AddListNode(t, &internal::arena_destruct_object<T>);
679 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
687 T(arg1, arg2, arg3, arg4);
688 if (!skip_explicit_ownership) {
689 AddListNode(t, &internal::arena_destruct_object<T>);
694 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
695 typename Arg4,
typename Arg5>
703 T(arg1, arg2, arg3, arg4, arg5);
704 if (!skip_explicit_ownership) {
705 AddListNode(t, &internal::arena_destruct_object<T>);
710 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
711 typename Arg4,
typename Arg5,
typename Arg6>
720 T(arg1, arg2, arg3, arg4, arg5, arg6);
721 if (!skip_explicit_ownership) {
722 AddListNode(t, &internal::arena_destruct_object<T>);
727 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
728 typename Arg4,
typename Arg5,
typename Arg6,
typename Arg7>
738 T(arg1, arg2, arg3, arg4, arg5, arg6, arg7);
739 if (!skip_explicit_ownership) {
740 AddListNode(t, &internal::arena_destruct_object<T>);
745 template <
typename T,
typename Arg1,
typename Arg2,
typename Arg3,
746 typename Arg4,
typename Arg5,
typename Arg6,
typename Arg7,
758 T(arg1, arg2, arg3, arg4, arg5, arg6, arg7, arg8);
759 if (!skip_explicit_ownership) {
760 AddListNode(t, &internal::arena_destruct_object<T>);
767 return CreateInternal<T, Arena*>(SkipDeleteList<T>(
static_cast<T*
>(0)),
774 return CreateInternal<T, Arena*>(SkipDeleteList<T>(
static_cast<T*
>(0)),
780 const Arg1& arg1,
const Arg2& arg2) {
781 return CreateInternal<T, Arena*>(SkipDeleteList<T>(
static_cast<T*
>(0)),
788 template <
typename T>
790 CreateInArenaStorageInternal(ptr, arena,
792 RegisterDestructorInternal(ptr, arena,
796 template <
typename T>
801 template <
typename T>
807 template <
typename T>
810 template <
typename T>
823 if (
object !=
NULL) {
824 AddListNode(
object, &internal::arena_delete_object< ::google::protobuf::Message >);
829 if (
object !=
NULL) {
830 AddListNode(
object, &internal::arena_delete_object<T>);
839 const T*
value,
typename T::InternalArenaConstructable_*) {
840 return value->GetArenaNoVirtual();
851 void* AllocateAligned(
const std::type_info* allocated,
size_t n);
855 return AllocateAligned(
NULL, n);
869 void AddListNode(
void* elem,
void (*cleanup)(
void*));
875 thread_cache().last_block_used_ = block;
876 thread_cache().last_lifecycle_id_seen = lifecycle_id_;
898 void AddBlock(Block*
b);
901 void AddBlockInternal(Block*
b);
902 void* SlowAlloc(
size_t n);
903 Block* FindBlock(
void* me);
904 Block* NewBlock(
void* me, Block* my_last_block,
size_t n,
905 size_t start_block_size,
size_t max_block_size);
906 static void* AllocFromBlock(Block*
b,
size_t n);
907 template <
typename Key,
typename T>
925 #endif // GOOGLE_PROTOBUF_ARENA_H__ static void CreateInArenaStorageInternal(T *ptr, Arena *arena, google::protobuf::internal::true_type)
Definition: arena.h:797
void Reset()
Definition: metrics_default.cc:285
#define size
Definition: float-mm.c:27
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateMessageInternal(typename T::InternalArenaConstructable_ *)
Definition: arena.h:766
Definition: type_traits.h:102
bool owns_first_block_
Definition: arena.h:895
size_t initial_block_size
Definition: arena.h:106
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateInternal(bool skip_explicit_ownership, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
Definition: arena.h:681
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateInternal(bool skip_explicit_ownership, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5, const Arg6 &arg6, const Arg7 &arg7)
Definition: arena.h:729
#define GOOGLE_DISALLOW_EVIL_CONSTRUCTORS(TypeName)
Definition: macros.h:40
Arena()
Definition: arena.h:229
#define GOOGLE_THREAD_LOCAL
Definition: port.h:292
static void RegisterDestructorInternal(T *ptr, Arena *arena, google::protobuf::internal::true_type)
Definition: arena.h:808
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateInternal(bool skip_explicit_ownership, const Arg1 &arg1, const Arg2 &arg2)
Definition: arena.h:657
bool t
Definition: UpdateContents.py:37
Definition: videoengine_unittest.h:62
Definition: type_traits.h:111
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE Msg * CreateMaybeMessage(Arena *arena, typename Msg::InternalArenaConstructable_ *)
Definition: arena.h:617
#define GOOGLE_ATTRIBUTE_NOINLINE
Definition: port.h:189
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateInternal(bool skip_explicit_ownership, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
Definition: arena.h:667
JavaScriptCore arg3
Definition: jsc-trace-profiler-events.d:41
#define GOOGLE_ATTRIBUTE_ALWAYS_INLINE
Definition: port.h:175
Message
Definition: peerconnection_unittest.cc:105
std::integral_constant< std::size_t, V > size_t
Definition: Brigand.h:447
GOOGLE_ATTRIBUTE_ALWAYS_INLINE ::google::protobuf::Arena * GetArena(const T *value)
Definition: arena.h:499
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateInternal(bool skip_explicit_ownership, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
Definition: arena.h:696
int64 lifecycle_id_
Definition: arena.h:879
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateInternal(bool skip_explicit_ownership, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5, const Arg6 &arg6)
Definition: arena.h:712
size_t start_block_size
Definition: arena.h:91
void
Definition: AVFoundationCFSoftLinking.h:81
EGLStreamKHR EGLint n
Definition: eglext.h:984
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * Create(::google::protobuf::Arena *arena, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5, const Arg6 &arg6, const Arg7 &arg7)
Definition: arena.h:397
Definition: template_util.h:77
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateInternal(bool skip_explicit_ownership)
Definition: arena.h:639
TestSubObjConstructor T
Definition: TestTypedefs.idl:84
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateInternalRawArray(size_t num_elements)
Definition: arena.h:630
Definition: interfaces.idl:172
EGLAttrib * value
Definition: eglext.h:120
void * elem
Definition: arena.h:887
void arena_free(void *object, size_t)
Definition: arena.h:80
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateMessage(::google::protobuf::Arena *arena, const Arg1 &arg1, const Arg2 &arg2)
Definition: arena.h:275
#define RTTI_TYPE_ID(type)
Definition: arena.h:162
GOOGLE_ATTRIBUTE_NOINLINE void OwnDestructor(T *object)
Definition: arena.h:479
static void CreateInArenaStorageInternal(T *ptr, Arena *arena, google::protobuf::internal::false_type)
Definition: arena.h:802
static void CreateInArenaStorage(T *ptr, Arena *arena)
Definition: arena.h:789
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * Create(::google::protobuf::Arena *arena, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5)
Definition: arena.h:365
GOOGLE_ATTRIBUTE_NOINLINE void OwnCustomDestructor(void *object, void(*destruct)(void *))
Definition: arena.h:489
ArenaOptions()
Definition: arena.h:140
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * Create(::google::protobuf::Arena *arena, const Arg1 &arg1, const Arg2 &arg2)
Definition: arena.h:323
static void RegisterDestructorInternal(T *ptr, Arena *arena, google::protobuf::internal::false_type)
Definition: arena.h:811
intptr_t AtomicWord
Definition: atomicops.h:92
Definition: ApplePayLineItem.idl:30
Definition: __init__.py:1
uint64_t uint64
Definition: port.h:136
GOOGLE_ATTRIBUTE_ALWAYS_INLINE void * AllocateAligned(size_t n)
Definition: arena.h:854
google::protobuf::internal::AtomicWord cleanup_list_
Definition: arena.h:892
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateMessageInternal(typename T::InternalArenaConstructable_ *, const Arg &arg)
Definition: arena.h:772
void arena_delete_object(void *object)
Definition: arena.h:77
Definition: xmlparse.c:217
#define malloc
Definition: mbmalloc.h:49
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateMessage(::google::protobuf::Arena *arena)
Definition: arena.h:250
GOOGLE_ATTRIBUTE_ALWAYS_INLINE ::google::protobuf::Arena * GetArenaInternal(const T *value,...)
Definition: arena.h:844
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * Create(::google::protobuf::Arena *arena, const Arg &arg)
Definition: arena.h:312
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * Create(::google::protobuf::Arena *arena, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5, const Arg6 &arg6)
Definition: arena.h:381
Node * next
Definition: arena.h:889
void * hooks_cookie_
Definition: arena.h:912
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateMessage(::google::protobuf::Arena *arena, const Arg &arg)
Definition: arena.h:262
Mutex blocks_lock_
Definition: arena.h:896
GOOGLE_ATTRIBUTE_NOINLINE void Own(T *object)
Definition: arena.h:469
Definition: document.h:393
Definition: atomic_sequence_num.h:39
void Init(int s, int n)
Definition: towers.c:162
#define GOOGLE_CHECK_LE(A, B)
Definition: logging.h:157
double max
Definition: DeviceProximityEvent.idl:32
void SetThreadCacheBlock(Block *block)
Definition: arena.h:874
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateMaybeMessage(Arena *arena,...)
Definition: arena.h:623
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * Create(::google::protobuf::Arena *arena, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5, const Arg6 &arg6, const Arg7 &arg7, const Arg8 &arg8)
Definition: arena.h:415
ArenaOptions options_
Definition: arena.h:914
int64_t int64
Definition: port.h:131
GOOGLE_ATTRIBUTE_ALWAYS_INLINE ::google::protobuf::Arena * GetArenaInternal(const T *value, typename T::InternalArenaConstructable_ *)
Definition: arena.h:838
#define NULL
Definition: common_types.h:41
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateArray(::google::protobuf::Arena *arena, size_t num_elements)
Definition: arena.h:436
EGLenum EGLObjectKHR object
Definition: eglext.h:121
JavaScriptCore arg4
Definition: jsc-trace-profiler-events.d:41
#define LIBPROTOBUF_EXPORT
Definition: port.h:97
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateMessageInternal(typename T::InternalArenaConstructable_ *, const Arg1 &arg1, const Arg2 &arg2)
Definition: arena.h:779
GLboolean GLboolean GLboolean b
Definition: gl2ext.h:306
Definition: gflags_completions.h:115
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * Create(::google::protobuf::Arena *arena)
Definition: arena.h:302
void arena_destruct_object(void *object)
Definition: arena.h:74
GOOGLE_ATTRIBUTE_ALWAYS_INLINE void OwnInternal(T *object, google::protobuf::internal::false_type)
Definition: arena.h:828
GOOGLE_ATTRIBUTE_ALWAYS_INLINE void OwnInternal(T *object, google::protobuf::internal::true_type)
Definition: arena.h:822
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateInternal(bool skip_explicit_ownership, const Arg &arg)
Definition: arena.h:648
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * Create(::google::protobuf::Arena *arena, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4)
Definition: arena.h:350
#define free
Definition: mbmalloc.h:50
size_t max_block_size
Definition: arena.h:97
google::protobuf::internal::AtomicWord hint_
Definition: arena.h:882
google::protobuf::internal::AtomicWord blocks_
Definition: arena.h:881
static GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * Create(::google::protobuf::Arena *arena, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3)
Definition: arena.h:335
GOOGLE_ATTRIBUTE_ALWAYS_INLINE T * CreateInternal(bool skip_explicit_ownership, const Arg1 &arg1, const Arg2 &arg2, const Arg3 &arg3, const Arg4 &arg4, const Arg5 &arg5, const Arg6 &arg6, const Arg7 &arg7, const Arg8 &arg8)
Definition: arena.h:748
char * initial_block
Definition: arena.h:103
Arena(const ArenaOptions &options)
Definition: arena.h:223
#define T(a)
Definition: row_common.cc:1964