| 28 (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEMORY_POOL, PurpleMemoryPoolPrivate)) |
28 (G_TYPE_INSTANCE_GET_PRIVATE((obj), PURPLE_TYPE_MEMORY_POOL, PurpleMemoryPoolPrivate)) |
| 29 #define PURPLE_MEMORY_POOL_BLOCK_PADDING (sizeof(guint64)) |
29 #define PURPLE_MEMORY_POOL_BLOCK_PADDING (sizeof(guint64)) |
| 30 #define PURPLE_MEMORY_POINTER_SHIFT(pointer, value) \ |
30 #define PURPLE_MEMORY_POINTER_SHIFT(pointer, value) \ |
| 31 (gpointer)((guintptr)(pointer) + (value)) |
31 (gpointer)((guintptr)(pointer) + (value)) |
| 32 #define PURPLE_MEMORY_PADDED(pointer, padding) \ |
32 #define PURPLE_MEMORY_PADDED(pointer, padding) \ |
| 33 (gpointer)(((guintptr)(pointer) - 1) % (padding) + 1) |
33 (gpointer)((((guintptr)(pointer) - 1) / (padding) + 1) * padding) |
| 34 |
34 |
| 35 #define PURPLE_MEMORY_POOL_DEFAULT_BLOCK_SIZE 1024 |
35 #define PURPLE_MEMORY_POOL_DEFAULT_BLOCK_SIZE 1024 |
| 36 |
36 |
| 37 typedef struct _PurpleMemoryPoolBlock PurpleMemoryPoolBlock; |
37 typedef struct _PurpleMemoryPoolBlock PurpleMemoryPoolBlock; |
| 38 |
38 |
| 75 * PURPLE_MEMORY_POOL_BLOCK_PADDING, but we guarantee, there is at least |
75 * PURPLE_MEMORY_POOL_BLOCK_PADDING, but we guarantee, there is at least |
| 76 * block_size long block if padded to that value. */ |
76 * block_size long block if padded to that value. */ |
| 77 block->available_ptr = PURPLE_MEMORY_POINTER_SHIFT(block_raw, |
77 block->available_ptr = PURPLE_MEMORY_POINTER_SHIFT(block_raw, |
| 78 sizeof(PurpleMemoryPoolBlock)); |
78 sizeof(PurpleMemoryPoolBlock)); |
| 79 block->end_ptr = PURPLE_MEMORY_POINTER_SHIFT(block_raw, total_size); |
79 block->end_ptr = PURPLE_MEMORY_POINTER_SHIFT(block_raw, total_size); |
| 80 |
80 block->next = NULL; |
| 81 memset(block, 0, sizeof(PurpleMemoryPoolBlock)); |
|
| 82 |
81 |
| 83 return block; |
82 return block; |
| 84 } |
83 } |
| 85 |
84 |
| 86 static gpointer |
85 static gpointer |
| 90 PurpleMemoryPoolBlock *blk; |
89 PurpleMemoryPoolBlock *blk; |
| 91 gpointer mem = NULL; |
90 gpointer mem = NULL; |
| 92 |
91 |
| 93 g_return_val_if_fail(priv != NULL, NULL); |
92 g_return_val_if_fail(priv != NULL, NULL); |
| 94 |
93 |
| |
94 g_return_val_if_fail(alignment <= PURPLE_MEMORY_POOL_BLOCK_PADDING, NULL); |
| 95 g_warn_if_fail(alignment >= 1); |
95 g_warn_if_fail(alignment >= 1); |
| 96 if (alignment < 1) |
96 if (alignment < 1) |
| 97 alignment = 1; |
97 alignment = 1; |
| 98 |
98 |
| 99 blk = priv->last_block; |
99 blk = priv->last_block; |