Tue, 25 Mar 2014 14:32:40 +0100
Trie, memory pool: we don't really need block_size pref to be that strict
--- a/libpurple/memorypool.c Tue Mar 25 14:19:13 2014 +0100 +++ b/libpurple/memorypool.c Tue Mar 25 14:32:40 2014 +0100 @@ -32,6 +32,8 @@ #define PURPLE_MEMORY_PADDED(pointer, padding) \ (gpointer)(((guintptr)(pointer) - 1) % (padding) + 1) +#define PURPLE_MEMORY_POOL_DEFAULT_BLOCK_SIZE 1024 + typedef struct _PurpleMemoryPoolBlock PurpleMemoryPoolBlock; typedef struct @@ -62,13 +64,11 @@ total_size = (sizeof(PurpleMemoryPoolBlock) - 1) / PURPLE_MEMORY_POOL_BLOCK_PADDING + 1; + g_return_val_if_fail(block_size < G_MAXSIZE - total_size, NULL); total_size += block_size; block_raw = g_try_malloc(total_size); - if (block_raw == NULL) { - g_error("out of memory"); - return NULL; - } + g_return_val_if_fail(block_raw != NULL, NULL); block = block_raw; /* in fact, we don't set available_ptr padded to @@ -84,14 +84,13 @@ } static gpointer -purple_memory_pool_alloc_impl(PurpleMemoryPool *pool, gulong size, guint alignment) +purple_memory_pool_alloc_impl(PurpleMemoryPool *pool, gsize size, guint alignment) { PurpleMemoryPoolPrivate *priv = PURPLE_MEMORY_POOL_GET_PRIVATE(pool); PurpleMemoryPoolBlock *blk; gpointer mem = NULL; g_return_val_if_fail(priv != NULL, NULL); - g_return_val_if_fail(size <= priv->block_size, NULL); g_warn_if_fail(alignment >= 1); if (alignment < 1) @@ -110,7 +109,10 @@ } if (mem == NULL) { - blk = purple_memory_pool_block_new(priv->block_size); + gsize real_size = priv->block_size; + if (real_size < size) + real_size = size; + blk = purple_memory_pool_block_new(real_size); g_return_val_if_fail(blk != NULL, NULL); if (priv->first_block == NULL) { @@ -140,10 +142,13 @@ ******************************************************************************/ gpointer -purple_memory_pool_alloc(PurpleMemoryPool *pool, gulong size, guint alignment) +purple_memory_pool_alloc(PurpleMemoryPool *pool, gsize size, guint alignment) { PurpleMemoryPoolClass *klass; + if (size == 0) + return NULL; + g_return_val_if_fail(PURPLE_IS_MEMORY_POOL(pool), NULL); klass = PURPLE_MEMORY_POOL_GET_CLASS(pool); @@ -154,10 +159,13 @@ } gpointer -purple_memory_pool_alloc0(PurpleMemoryPool *pool, gulong size, guint alignment) +purple_memory_pool_alloc0(PurpleMemoryPool *pool, gsize size, guint alignment) { gpointer mem; + if (size == 0) + return NULL; + mem = purple_memory_pool_alloc(pool, size, alignment); g_return_val_if_fail(mem != NULL, NULL); @@ -171,6 +179,9 @@ { PurpleMemoryPoolClass *klass; + if (mem == NULL) + return; + g_return_if_fail(PURPLE_IS_MEMORY_POOL(pool)); klass = PURPLE_MEMORY_POOL_GET_CLASS(pool); @@ -196,11 +207,9 @@ static GParamSpec *properties[PROP_LAST]; PurpleMemoryPool * -purple_memory_pool_new(gulong block_size) +purple_memory_pool_new(void) { - return g_object_new(PURPLE_TYPE_MEMORY_POOL, - "block-size", block_size, - NULL); + return g_object_new(PURPLE_TYPE_MEMORY_POOL, NULL); } static void @@ -267,9 +276,8 @@ klass->palloc = purple_memory_pool_alloc_impl; properties[PROP_BLOCK_SIZE] = g_param_spec_ulong("block-size", - "Block size", "The size of each block of pool memory. Allocated" - " items have to be smaller than this value", - 1, G_MAXULONG, 1024, + "Block size", "The default size of each block of pool memory.", + 0, G_MAXULONG, PURPLE_MEMORY_POOL_DEFAULT_BLOCK_SIZE, G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); g_object_class_install_properties(obj_class, PROP_LAST, properties);
--- a/libpurple/memorypool.h Tue Mar 25 14:19:13 2014 +0100 +++ b/libpurple/memorypool.h Tue Mar 25 14:32:40 2014 +0100 @@ -51,7 +51,7 @@ /*< private >*/ GObjectClass parent_class; - gpointer (*palloc)(PurpleMemoryPool *pool, gulong size, guint alignment); + gpointer (*palloc)(PurpleMemoryPool *pool, gsize size, guint alignment); gpointer (*pfree)(PurpleMemoryPool *pool, gpointer mem); void (*purple_reserved1)(void); @@ -67,15 +67,13 @@ /** * purple_memory_pool_new: - * @blocksize: The size of each block of pool memory. Allocated items have to - * be smaller than this value. * * Creates a new memory pool. * * Returns: The new #PurpleMemoryPool. */ PurpleMemoryPool * -purple_memory_pool_new(gulong block_size); +purple_memory_pool_new(void); /** * purple_memory_pool_alloc: @@ -89,7 +87,7 @@ * a call to purple_memory_pool_free. */ gpointer -purple_memory_pool_alloc(PurpleMemoryPool *pool, gulong size, guint alignment); +purple_memory_pool_alloc(PurpleMemoryPool *pool, gsize size, guint alignment); /** * purple_memory_pool_alloc0: @@ -104,7 +102,7 @@ * a call to purple_memory_pool_free. */ gpointer -purple_memory_pool_alloc0(PurpleMemoryPool *pool, gulong size, guint alignment); +purple_memory_pool_alloc0(PurpleMemoryPool *pool, gsize size, guint alignment); /** * purple_memory_pool_free:
--- a/libpurple/trie.c Tue Mar 25 14:19:13 2014 +0100 +++ b/libpurple/trie.c Tue Mar 25 14:32:40 2014 +0100 @@ -32,7 +32,6 @@ typedef struct { gboolean reset_on_match; - gulong block_size; PurpleMemoryPool *records_mempool; GSList *records; @@ -96,7 +95,6 @@ { PROP_ZERO, PROP_RESET_ON_MATCH, - PROP_BLOCK_SIZE, PROP_LAST }; @@ -115,7 +113,7 @@ PurpleTrie *trie = PURPLE_TRIE(instance); PurpleTriePrivate *priv = PURPLE_TRIE_GET_PRIVATE(trie); - priv->records_mempool = purple_memory_pool_new(priv->block_size); + priv->records_mempool = purple_memory_pool_new(); } static void @@ -140,9 +138,6 @@ case PROP_RESET_ON_MATCH: g_value_set_boolean(value, priv->reset_on_match); break; - case PROP_BLOCK_SIZE: - g_value_set_ulong(value, priv->block_size); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); } @@ -159,9 +154,6 @@ case PROP_RESET_ON_MATCH: priv->reset_on_match = g_value_get_boolean(value); break; - case PROP_BLOCK_SIZE: - priv->block_size = g_value_get_ulong(value); - break; default: G_OBJECT_WARN_INVALID_PROPERTY_ID(obj, param_id, pspec); } @@ -186,12 +178,6 @@ "ensures, that every match is distinct from each other.", TRUE, G_PARAM_READWRITE | G_PARAM_STATIC_STRINGS); - properties[PROP_BLOCK_SIZE] = g_param_spec_ulong("block-size", - "Block size", "The size of each block of pool memory. Every " - "string in trie have to be smaller than this value", - 1, G_MAXULONG, 1024, - G_PARAM_READWRITE | G_PARAM_CONSTRUCT | G_PARAM_STATIC_STRINGS); - g_object_class_install_properties(obj_class, PROP_LAST, properties); }