From 040f7e6ba2e2282b80f332a031b77d7d34b4fc85 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Mon, 24 Aug 2009 21:44:22 -0700 Subject: Significant memory-management refactoring any Python extension. --- src/upb_array.h | 89 ++++++++++----------------------------------------------- 1 file changed, 15 insertions(+), 74 deletions(-) (limited to 'src/upb_array.h') diff --git a/src/upb_array.h b/src/upb_array.h index 370f6eb..732c4aa 100644 --- a/src/upb_array.h +++ b/src/upb_array.h @@ -23,7 +23,7 @@ #define UPB_ARRAY_H_ #include -#include "upb.h" +#include "upb_msg.h" /* Because we use upb_msg_fielddef */ #ifdef __cplusplus extern "C" { @@ -31,41 +31,6 @@ extern "C" { struct upb_string; -/* upb_arrays can be at most 2**32 elements long. */ -typedef uint32_t upb_arraylen_t; - -/* Represents an array (a repeated field) of any type. The interpretation of - * the data in the array depends on the type. */ -struct upb_array { - union upb_value_ptr elements; - upb_arraylen_t len; /* Number of elements in "elements". */ - upb_arraylen_t size; /* Memory we own (0 if by reference). */ - void *gptr; -}; - -INLINE void upb_array_init(struct upb_array *arr) -{ - arr->elements._void = NULL; - arr->len = 0; - arr->size = 0; -} - -INLINE void upb_array_uninit(struct upb_array *arr) -{ - if(arr->size) free(arr->elements._void); -} - -INLINE struct upb_array *upb_array_new(void) { - struct upb_array *arr = malloc(sizeof(*arr)); - upb_array_init(arr); - return arr; -} - -INLINE void upb_array_free(struct upb_array *arr) { - upb_array_uninit(arr); - free(arr); -} - /* Returns a pointer to an array element. Does not perform a bounds check! */ INLINE union upb_value_ptr upb_array_getelementptr( struct upb_array *arr, upb_arraylen_t n, upb_field_type_t type) @@ -75,10 +40,17 @@ INLINE union upb_value_ptr upb_array_getelementptr( return ptr; } -INLINE union upb_value upb_array_getelement( - struct upb_array *arr, upb_arraylen_t n, upb_field_type_t type) +/* Allocation/Deallocation/Resizing. ******************************************/ + +INLINE struct upb_array *upb_array_new(struct upb_msg_fielddef *f) { - return upb_deref(upb_array_getelementptr(arr, n, type), type); + struct upb_array *arr = malloc(sizeof(*arr)); + upb_mmhead_init(&arr->mmhead); + arr->elements._void = NULL; + arr->len = 0; + arr->size = 0; + arr->fielddef = f; + return arr; } INLINE uint32_t upb_round_up_to_pow2(uint32_t v) @@ -94,13 +66,10 @@ INLINE uint32_t upb_round_up_to_pow2(uint32_t v) return v; } -/* Resizes array to be "len" elements long and ensures we have write access - * to the array (reallocating if necessary). Returns true iff we were - * referencing memory for the array and dropped the reference. */ -INLINE bool upb_array_resize(struct upb_array *arr, upb_arraylen_t newlen, - upb_field_type_t type) +/* Resizes array to be "len" elements long (reallocating if necessary). */ +INLINE bool upb_array_resize(struct upb_array *arr, upb_arraylen_t newlen) { - size_t type_size = upb_type_info[type].size; + size_t type_size = upb_type_info[arr->fielddef->type].size; bool dropped = false; bool ref = arr->size == 0; /* Ref'ing external memory. */ void *data = arr->elements._void; @@ -114,39 +83,11 @@ INLINE bool upb_array_resize(struct upb_array *arr, upb_arraylen_t newlen, memcpy(arr->elements._void, data, UPB_MIN(arr->len, newlen) * type_size); dropped = true; } + /* TODO: fill with defaults. */ arr->len = newlen; return dropped; } -/* These are all overlays on upb_array, pointers between them can be cast. */ -#define UPB_DEFINE_ARRAY_TYPE(name, type) \ - struct name ## _array { \ - struct upb_fielddef *f; \ - void *gptr; \ - type *elements; \ - upb_arraylen_t len; \ - upb_arraylen_t size; \ - }; - -UPB_DEFINE_ARRAY_TYPE(upb_double, double) -UPB_DEFINE_ARRAY_TYPE(upb_float, float) -UPB_DEFINE_ARRAY_TYPE(upb_int32, int32_t) -UPB_DEFINE_ARRAY_TYPE(upb_int64, int64_t) -UPB_DEFINE_ARRAY_TYPE(upb_uint32, uint32_t) -UPB_DEFINE_ARRAY_TYPE(upb_uint64, uint64_t) -UPB_DEFINE_ARRAY_TYPE(upb_bool, bool) -UPB_DEFINE_ARRAY_TYPE(upb_string, struct upb_string*) -UPB_DEFINE_ARRAY_TYPE(upb_msg, void*) - -/* Defines an array of a specific message type (an overlay of upb_array). */ -#define UPB_MSG_ARRAY(msg_type) struct msg_type ## _array -#define UPB_DEFINE_MSG_ARRAY(msg_type) \ - UPB_MSG_ARRAY(msg_type) { \ - msg_type **elements; \ - upb_arraylen_t len; \ - upb_arraylen_t size; \ - }; - #ifdef __cplusplus } /* extern "C" */ #endif -- cgit v1.2.3