Auto-generate files after cl/702483612
diff --git a/php/ext/google/protobuf/php-upb.c b/php/ext/google/protobuf/php-upb.c
index b5689fc..4d46cde 100644
--- a/php/ext/google/protobuf/php-upb.c
+++ b/php/ext/google/protobuf/php-upb.c
@@ -2891,6 +2891,10 @@
// 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 @@
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_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 @@
(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 @@
upb_free(block_alloc, block);
block = next_block;
}
+ if (alloc_cleanup != NULL) {
+ alloc_cleanup(block_alloc);
+ }
ai = next_arena;
}
}
@@ -3285,6 +3295,12 @@
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 dd8205d..a37e667 100644
--- a/php/ext/google/protobuf/php-upb.h
+++ b/php/ext/google/protobuf/php-upb.h
@@ -599,7 +599,7 @@
//
// 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 @@
typedef struct upb_Arena upb_Arena;
+typedef void upb_AllocCleanupFunc(upb_alloc* alloc);
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -706,6 +708,11 @@
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 f09e6ea..bf2d159 100644
--- a/ruby/ext/google/protobuf_c/ruby-upb.c
+++ b/ruby/ext/google/protobuf_c/ruby-upb.c
@@ -2891,6 +2891,10 @@
// 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 @@
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_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 @@
(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 @@
upb_free(block_alloc, block);
block = next_block;
}
+ if (alloc_cleanup != NULL) {
+ alloc_cleanup(block_alloc);
+ }
ai = next_arena;
}
}
@@ -3285,6 +3295,12 @@
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 eff5f1a..33d0a07 100755
--- a/ruby/ext/google/protobuf_c/ruby-upb.h
+++ b/ruby/ext/google/protobuf_c/ruby-upb.h
@@ -601,7 +601,7 @@
//
// 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 @@
typedef struct upb_Arena upb_Arena;
+typedef void upb_AllocCleanupFunc(upb_alloc* alloc);
+
#ifdef __cplusplus
extern "C" {
#endif
@@ -708,6 +710,11 @@
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);