From bedda1d42473ee9e260648a0c3c1817de16d0c09 Mon Sep 17 00:00:00 2001 From: Protobuf Team Bot Date: Tue, 3 Dec 2024 23:26:22 +0000 Subject: [PATCH] Auto-generate files after cl/702483612 --- php/ext/google/protobuf/php-upb.c | 16 ++++++++++++++++ php/ext/google/protobuf/php-upb.h | 9 ++++++++- ruby/ext/google/protobuf_c/ruby-upb.c | 16 ++++++++++++++++ ruby/ext/google/protobuf_c/ruby-upb.h | 9 ++++++++- 4 files changed, 48 insertions(+), 2 deletions(-) diff --git a/php/ext/google/protobuf/php-upb.c b/php/ext/google/protobuf/php-upb.c index b5689fc17291..4d46cde7a35c 100644 --- a/php/ext/google/protobuf/php-upb.c +++ b/php/ext/google/protobuf/php-upb.c @@ -2891,6 +2891,10 @@ typedef struct upb_ArenaInternal { // block. uintptr_t block_alloc; + // The cleanup for the allocator. This is called after all the blocks are + // freed in an arena. + upb_AllocCleanupFunc* upb_alloc_cleanup; + // When multiple arenas are fused together, each arena points to a parent // arena (root points to itself). The root tracks how many live arenas // reference it. @@ -3158,6 +3162,7 @@ static upb_Arena* _upb_Arena_InitSlow(upb_alloc* alloc) { upb_Atomic_Init(&a->body.next, NULL); upb_Atomic_Init(&a->body.tail, &a->body); upb_Atomic_Init(&a->body.blocks, NULL); + a->body.upb_alloc_cleanup = NULL; _upb_Arena_AddBlock(&a->head, mem, n); @@ -3196,6 +3201,7 @@ upb_Arena* upb_Arena_Init(void* mem, size_t n, upb_alloc* alloc) { upb_Atomic_Init(&a->body.next, NULL); upb_Atomic_Init(&a->body.tail, &a->body); upb_Atomic_Init(&a->body.blocks, NULL); + a->body.upb_alloc_cleanup = NULL; a->body.block_alloc = _upb_Arena_MakeBlockAlloc(alloc, 1); a->head.UPB_PRIVATE(ptr) = mem; @@ -3214,6 +3220,7 @@ static void _upb_Arena_DoFree(upb_ArenaInternal* ai) { (upb_ArenaInternal*)upb_Atomic_Load(&ai->next, memory_order_acquire); upb_alloc* block_alloc = _upb_ArenaInternal_BlockAlloc(ai); upb_MemBlock* block = upb_Atomic_Load(&ai->blocks, memory_order_acquire); + upb_AllocCleanupFunc* alloc_cleanup = *ai->upb_alloc_cleanup; while (block != NULL) { // Load first since we are deleting block. upb_MemBlock* next_block = @@ -3221,6 +3228,9 @@ static void _upb_Arena_DoFree(upb_ArenaInternal* ai) { upb_free(block_alloc, block); block = next_block; } + if (alloc_cleanup != NULL) { + alloc_cleanup(block_alloc); + } ai = next_arena; } } @@ -3285,6 +3295,12 @@ static void _upb_Arena_DoFuseArenaLists(upb_ArenaInternal* const parent, upb_Atomic_Store(&parent->tail, parent_tail, memory_order_relaxed); } +void upb_Arena_SetAllocCleanup(upb_Arena* a, upb_AllocCleanupFunc* func) { + upb_ArenaInternal* ai = upb_Arena_Internal(a); + UPB_ASSERT(ai->upb_alloc_cleanup == NULL); + ai->upb_alloc_cleanup = func; +} + static upb_ArenaInternal* _upb_Arena_DoFuse(const upb_Arena* a1, const upb_Arena* a2, uintptr_t* ref_delta) { diff --git a/php/ext/google/protobuf/php-upb.h b/php/ext/google/protobuf/php-upb.h index dd8205df012f..a37e667e2f78 100644 --- a/php/ext/google/protobuf/php-upb.h +++ b/php/ext/google/protobuf/php-upb.h @@ -599,7 +599,7 @@ UPB_INLINE void upb_gfree(void* ptr) { upb_free(&upb_alloc_global, ptr); } // // We need this because the decoder inlines a upb_Arena for performance but // the full struct is not visible outside of arena.c. Yes, I know, it's awful. -#define UPB_ARENA_SIZE_HACK 7 +#define UPB_ARENA_SIZE_HACK 8 // LINT.IfChange(upb_Arena) @@ -696,6 +696,8 @@ UPB_API_INLINE void upb_Arena_ShrinkLast(struct upb_Arena* a, void* ptr, typedef struct upb_Arena upb_Arena; +typedef void upb_AllocCleanupFunc(upb_alloc* alloc); + #ifdef __cplusplus extern "C" { #endif @@ -706,6 +708,11 @@ extern "C" { UPB_API upb_Arena* upb_Arena_Init(void* mem, size_t n, upb_alloc* alloc); UPB_API void upb_Arena_Free(upb_Arena* a); +// Sets the cleanup function for the upb_alloc used by the arena. Only one +// cleanup function can be set, which will be called after all blocks are +// freed. +UPB_API void upb_Arena_SetAllocCleanup(upb_Arena* a, + upb_AllocCleanupFunc* func); UPB_API bool upb_Arena_Fuse(const upb_Arena* a, const upb_Arena* b); UPB_API bool upb_Arena_IsFused(const upb_Arena* a, const upb_Arena* b); diff --git a/ruby/ext/google/protobuf_c/ruby-upb.c b/ruby/ext/google/protobuf_c/ruby-upb.c index f09e6eaa3c9c..bf2d15971715 100644 --- a/ruby/ext/google/protobuf_c/ruby-upb.c +++ b/ruby/ext/google/protobuf_c/ruby-upb.c @@ -2891,6 +2891,10 @@ typedef struct upb_ArenaInternal { // block. uintptr_t block_alloc; + // The cleanup for the allocator. This is called after all the blocks are + // freed in an arena. + upb_AllocCleanupFunc* upb_alloc_cleanup; + // When multiple arenas are fused together, each arena points to a parent // arena (root points to itself). The root tracks how many live arenas // reference it. @@ -3158,6 +3162,7 @@ static upb_Arena* _upb_Arena_InitSlow(upb_alloc* alloc) { upb_Atomic_Init(&a->body.next, NULL); upb_Atomic_Init(&a->body.tail, &a->body); upb_Atomic_Init(&a->body.blocks, NULL); + a->body.upb_alloc_cleanup = NULL; _upb_Arena_AddBlock(&a->head, mem, n); @@ -3196,6 +3201,7 @@ upb_Arena* upb_Arena_Init(void* mem, size_t n, upb_alloc* alloc) { upb_Atomic_Init(&a->body.next, NULL); upb_Atomic_Init(&a->body.tail, &a->body); upb_Atomic_Init(&a->body.blocks, NULL); + a->body.upb_alloc_cleanup = NULL; a->body.block_alloc = _upb_Arena_MakeBlockAlloc(alloc, 1); a->head.UPB_PRIVATE(ptr) = mem; @@ -3214,6 +3220,7 @@ static void _upb_Arena_DoFree(upb_ArenaInternal* ai) { (upb_ArenaInternal*)upb_Atomic_Load(&ai->next, memory_order_acquire); upb_alloc* block_alloc = _upb_ArenaInternal_BlockAlloc(ai); upb_MemBlock* block = upb_Atomic_Load(&ai->blocks, memory_order_acquire); + upb_AllocCleanupFunc* alloc_cleanup = *ai->upb_alloc_cleanup; while (block != NULL) { // Load first since we are deleting block. upb_MemBlock* next_block = @@ -3221,6 +3228,9 @@ static void _upb_Arena_DoFree(upb_ArenaInternal* ai) { upb_free(block_alloc, block); block = next_block; } + if (alloc_cleanup != NULL) { + alloc_cleanup(block_alloc); + } ai = next_arena; } } @@ -3285,6 +3295,12 @@ static void _upb_Arena_DoFuseArenaLists(upb_ArenaInternal* const parent, upb_Atomic_Store(&parent->tail, parent_tail, memory_order_relaxed); } +void upb_Arena_SetAllocCleanup(upb_Arena* a, upb_AllocCleanupFunc* func) { + upb_ArenaInternal* ai = upb_Arena_Internal(a); + UPB_ASSERT(ai->upb_alloc_cleanup == NULL); + ai->upb_alloc_cleanup = func; +} + static upb_ArenaInternal* _upb_Arena_DoFuse(const upb_Arena* a1, const upb_Arena* a2, uintptr_t* ref_delta) { diff --git a/ruby/ext/google/protobuf_c/ruby-upb.h b/ruby/ext/google/protobuf_c/ruby-upb.h index eff5f1aaf2fb..33d0a07eb221 100755 --- a/ruby/ext/google/protobuf_c/ruby-upb.h +++ b/ruby/ext/google/protobuf_c/ruby-upb.h @@ -601,7 +601,7 @@ UPB_INLINE void upb_gfree(void* ptr) { upb_free(&upb_alloc_global, ptr); } // // We need this because the decoder inlines a upb_Arena for performance but // the full struct is not visible outside of arena.c. Yes, I know, it's awful. -#define UPB_ARENA_SIZE_HACK 7 +#define UPB_ARENA_SIZE_HACK 8 // LINT.IfChange(upb_Arena) @@ -698,6 +698,8 @@ UPB_API_INLINE void upb_Arena_ShrinkLast(struct upb_Arena* a, void* ptr, typedef struct upb_Arena upb_Arena; +typedef void upb_AllocCleanupFunc(upb_alloc* alloc); + #ifdef __cplusplus extern "C" { #endif @@ -708,6 +710,11 @@ extern "C" { UPB_API upb_Arena* upb_Arena_Init(void* mem, size_t n, upb_alloc* alloc); UPB_API void upb_Arena_Free(upb_Arena* a); +// Sets the cleanup function for the upb_alloc used by the arena. Only one +// cleanup function can be set, which will be called after all blocks are +// freed. +UPB_API void upb_Arena_SetAllocCleanup(upb_Arena* a, + upb_AllocCleanupFunc* func); UPB_API bool upb_Arena_Fuse(const upb_Arena* a, const upb_Arena* b); UPB_API bool upb_Arena_IsFused(const upb_Arena* a, const upb_Arena* b);