--- a/libpurple/memorypool.c Wed Mar 26 19:38:58 2014 +0100
+++ b/libpurple/memorypool.c Thu Mar 27 17:48:39 2014 +0100
@@ -51,6 +51,17 @@
PurpleMemoryPoolBlock *next;
+static GObjectClass *parent_class = NULL; +static GParamSpec *properties[PROP_LAST]; /*******************************************************************************
* Memory allocation/deallocation
******************************************************************************/
@@ -62,8 +73,10 @@
PurpleMemoryPoolBlock *block;
- total_size = (sizeof(PurpleMemoryPoolBlock) - 1) /
- PURPLE_MEMORY_POOL_BLOCK_PADDING + 1;
+ /* ceil block struct size to the multipy of align */ + total_size = ((sizeof(PurpleMemoryPoolBlock) - 1) / + PURPLE_MEMORY_POOL_BLOCK_PADDING + 1) * + sizeof(PurpleMemoryPoolBlock); g_return_val_if_fail(block_size < G_MAXSIZE - total_size, NULL);
total_size += block_size;
@@ -124,7 +137,7 @@
mem = PURPLE_MEMORY_PADDED(blk->available_ptr, alignment);
- g_assert(mem < blk->end_ptr);
+ g_assert(mem + size < blk->end_ptr); g_assert(mem >= blk->available_ptr); /* gpointer overflow */
@@ -146,6 +159,7 @@
g_return_if_fail(priv != NULL);
+ priv->first_block = NULL; PurpleMemoryPoolBlock *next = blk->next;
@@ -158,6 +172,17 @@
******************************************************************************/
+purple_memory_pool_set_block_size(PurpleMemoryPool *pool, gulong block_size) + PurpleMemoryPoolPrivate *priv = PURPLE_MEMORY_POOL_GET_PRIVATE(pool); + g_return_if_fail(priv != NULL); + priv->block_size = block_size; + g_object_notify_by_pspec(G_OBJECT(pool), properties[PROP_BLOCK_SIZE]); purple_memory_pool_alloc(PurpleMemoryPool *pool, gsize size, guint alignment)
@@ -226,30 +251,12 @@
******************************************************************************/
-static GObjectClass *parent_class = NULL;
-static GParamSpec *properties[PROP_LAST];
purple_memory_pool_new(void)
return g_object_new(PURPLE_TYPE_MEMORY_POOL, NULL);
-purple_memory_pool_new_sized(gulong block_size)
- return g_object_new(PURPLE_TYPE_MEMORY_POOL,
- "block-size", block_size,
purple_memory_pool_finalize(GObject *obj)
--- a/libpurple/memorypool.h Wed Mar 26 19:38:58 2014 +0100
+++ b/libpurple/memorypool.h Thu Mar 27 17:48:39 2014 +0100
@@ -77,14 +77,15 @@
purple_memory_pool_new(void);
- * purple_memory_pool_new_sized:
- * Creates a new memory pool with non-default block size.
+ * purple_memory_pool_set_block_size: + * @pool: The memory pool. + * @block_size: The new default block size. - * Returns: The new #PurpleMemoryPool.
+ * Sets new default block size for a memory pool. You might want to call this + * before any allocation, to have it applied to the every created block.
-purple_memory_pool_new_sized(gulong block_size);
+purple_memory_pool_set_block_size(PurpleMemoryPool *pool, gulong block_size); * purple_memory_pool_alloc:
--- a/libpurple/trie.c Wed Mar 26 19:38:58 2014 +0100
+++ b/libpurple/trie.c Thu Mar 27 17:48:39 2014 +0100
@@ -611,7 +611,8 @@
priv->records_obj_mempool = purple_memory_pool_new();
priv->records_str_mempool = purple_memory_pool_new();
- priv->states_mempool = purple_memory_pool_new_sized(
+ priv->states_mempool = purple_memory_pool_new(); + purple_memory_pool_set_block_size(priv->states_mempool, PURPLE_TRIE_STATES_POOL_BLOCK_SIZE);