summaryrefslogtreecommitdiffstats
path: root/src/libutil
diff options
context:
space:
mode:
authorVsevolod Stakhov <vsevolod@highsecure.ru>2019-12-23 16:40:20 +0000
committerVsevolod Stakhov <vsevolod@highsecure.ru>2019-12-23 16:40:20 +0000
commit92abcea04fa67e69bb5951049e945356ceae4670 (patch)
treeb147dbe79dcc74c729f61a9262dd638d68637bc5 /src/libutil
parente6c42dc71175916c01074f5605afc5b3257fe725 (diff)
downloadrspamd-92abcea04fa67e69bb5951049e945356ceae4670.tar.gz
rspamd-92abcea04fa67e69bb5951049e945356ceae4670.zip
[Project] Support mempool flags
Diffstat (limited to 'src/libutil')
-rw-r--r--src/libutil/map_helpers.c10
-rw-r--r--src/libutil/mem_pool.c62
-rw-r--r--src/libutil/mem_pool.h42
-rw-r--r--src/libutil/mem_pool_internal.h5
-rw-r--r--src/libutil/radix.c2
-rw-r--r--src/libutil/upstream.c2
6 files changed, 80 insertions, 43 deletions
diff --git a/src/libutil/map_helpers.c b/src/libutil/map_helpers.c
index d67e2fc4d..d179d44f5 100644
--- a/src/libutil/map_helpers.c
+++ b/src/libutil/map_helpers.c
@@ -631,11 +631,11 @@ rspamd_map_helper_new_hash (struct rspamd_map *map)
if (map) {
pool = rspamd_mempool_new (rspamd_mempool_suggest_size (),
- map->tag);
+ map->tag, 0);
}
else {
pool = rspamd_mempool_new (rspamd_mempool_suggest_size (),
- NULL);
+ NULL, 0);
}
htb = rspamd_mempool_alloc0 (pool, sizeof (*htb));
@@ -688,11 +688,11 @@ rspamd_map_helper_new_radix (struct rspamd_map *map)
if (map) {
pool = rspamd_mempool_new (rspamd_mempool_suggest_size (),
- map->tag);
+ map->tag, 0);
}
else {
pool = rspamd_mempool_new (rspamd_mempool_suggest_size (),
- NULL);
+ NULL, 0);
}
r = rspamd_mempool_alloc0 (pool, sizeof (*r));
@@ -746,7 +746,7 @@ rspamd_map_helper_new_regexp (struct rspamd_map *map,
rspamd_mempool_t *pool;
pool = rspamd_mempool_new (rspamd_mempool_suggest_size (),
- map->tag);
+ map->tag, 0);
re_map = rspamd_mempool_alloc0 (pool, sizeof (*re_map));
re_map->pool = pool;
diff --git a/src/libutil/mem_pool.c b/src/libutil/mem_pool.c
index 54113b265..728c10350 100644
--- a/src/libutil/mem_pool.c
+++ b/src/libutil/mem_pool.c
@@ -272,7 +272,7 @@ rspamd_mempool_append_chain (rspamd_mempool_t * pool,
* @return new memory pool object
*/
rspamd_mempool_t *
-rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc)
+rspamd_mempool_new_ (gsize size, const gchar *tag, gint flags, const gchar *loc)
{
rspamd_mempool_t *new_pool;
gpointer map;
@@ -345,6 +345,7 @@ rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc)
/*
* Memory layout:
* struct rspamd_mempool_t
+ * <optional debug hash table>
* struct rspamd_mempool_specific
* struct _pool_chain
* alignment (if needed)
@@ -353,6 +354,7 @@ rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc)
guchar *mem_chunk;
gint ret = posix_memalign ((void **)&mem_chunk, MIN_MEM_ALIGNMENT,
total_size);
+ gsize priv_offset;
if (ret != 0 || mem_chunk == NULL) {
g_error ("%s: failed to allocate %"G_GSIZE_FORMAT" bytes: %d - %s",
@@ -362,14 +364,26 @@ rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc)
/* Set memory layout */
new_pool = (rspamd_mempool_t *)mem_chunk;
+ if (flags & RSPAMD_MEMPOOL_DEBUG) {
+ /* Allocate debug table */
+ GHashTable *debug_tbl = (GHashTable *)(mem_chunk + sizeof (rspamd_mempool_t));
+
+ debug_tbl = g_hash_table_new (rspamd_str_hash, rspamd_str_equal);
+ priv_offset = sizeof (rspamd_mempool_t) + sizeof (GHashTable *);
+ }
+ else {
+ priv_offset = sizeof (rspamd_mempool_t);
+ }
+
new_pool->priv = (struct rspamd_mempool_specific *)(mem_chunk +
- sizeof (rspamd_mempool_t));
- /* Zere memory for specific and for the first chain */
+ priv_offset);
+ /* Zero memory for specific and for the first chain */
memset (new_pool->priv, 0, sizeof (struct rspamd_mempool_specific) +
sizeof (struct _pool_chain));
new_pool->priv->entry = entry;
new_pool->priv->elt_len = size;
+ new_pool->priv->flags = flags;
if (tag) {
rspamd_strlcpy (new_pool->tag.tagname, tag, sizeof (new_pool->tag.tagname));
@@ -393,11 +407,11 @@ rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc)
nchain = (struct _pool_chain *)
(mem_chunk +
- sizeof (rspamd_mempool_t) +
- sizeof (struct rspamd_mempool_specific));
+ priv_offset +
+ sizeof (struct rspamd_mempool_specific));
guchar *unaligned = mem_chunk +
- sizeof (rspamd_mempool_t) +
+ priv_offset +
sizeof (struct rspamd_mempool_specific) +
sizeof (struct _pool_chain);
@@ -418,12 +432,13 @@ rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc)
static void *
memory_pool_alloc_common (rspamd_mempool_t * pool, gsize size,
- enum rspamd_mempool_chain_type pool_type)
+ enum rspamd_mempool_chain_type pool_type,
+ const gchar *loc)
RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
static void *
memory_pool_alloc_common (rspamd_mempool_t * pool, gsize size,
- enum rspamd_mempool_chain_type pool_type)
+ enum rspamd_mempool_chain_type pool_type, const gchar *loc)
{
guint8 *tmp;
struct _pool_chain *new, *cur;
@@ -497,22 +512,21 @@ memory_pool_alloc_common (rspamd_mempool_t * pool, gsize size,
void *
-rspamd_mempool_alloc (rspamd_mempool_t * pool, gsize size)
+rspamd_mempool_alloc_ (rspamd_mempool_t * pool, gsize size, const gchar *loc)
{
- return memory_pool_alloc_common (pool, size, RSPAMD_MEMPOOL_NORMAL);
+ return memory_pool_alloc_common (pool, size, RSPAMD_MEMPOOL_NORMAL, loc);
}
void *
-rspamd_mempool_alloc0 (rspamd_mempool_t * pool, gsize size)
+rspamd_mempool_alloc0_ (rspamd_mempool_t * pool, gsize size, const gchar *loc)
{
- void *pointer = rspamd_mempool_alloc (pool, size);
-
+ void *pointer = rspamd_mempool_alloc_ (pool, size, loc);
memset (pointer, 0, size);
return pointer;
}
void *
-rspamd_mempool_alloc0_shared (rspamd_mempool_t * pool, gsize size)
+rspamd_mempool_alloc0_shared_ (rspamd_mempool_t * pool, gsize size, const gchar *loc)
{
void *pointer = rspamd_mempool_alloc_shared (pool, size);
@@ -521,14 +535,14 @@ rspamd_mempool_alloc0_shared (rspamd_mempool_t * pool, gsize size)
}
void *
-rspamd_mempool_alloc_shared (rspamd_mempool_t * pool, gsize size)
+rspamd_mempool_alloc_shared_ (rspamd_mempool_t * pool, gsize size, const gchar *loc)
{
- return memory_pool_alloc_common (pool, size, RSPAMD_MEMPOOL_SHARED);
+ return memory_pool_alloc_common (pool, size, RSPAMD_MEMPOOL_SHARED, loc);
}
gchar *
-rspamd_mempool_strdup (rspamd_mempool_t * pool, const gchar *src)
+rspamd_mempool_strdup_ (rspamd_mempool_t * pool, const gchar *src, const gchar *loc)
{
gsize len;
gchar *newstr;
@@ -538,7 +552,7 @@ rspamd_mempool_strdup (rspamd_mempool_t * pool, const gchar *src)
}
len = strlen (src);
- newstr = rspamd_mempool_alloc (pool, len + 1);
+ newstr = rspamd_mempool_alloc_ (pool, len + 1, loc);
memcpy (newstr, src, len);
newstr[len] = '\0';
@@ -546,7 +560,8 @@ rspamd_mempool_strdup (rspamd_mempool_t * pool, const gchar *src)
}
gchar *
-rspamd_mempool_fstrdup (rspamd_mempool_t * pool, const struct f_str_s *src)
+rspamd_mempool_fstrdup_ (rspamd_mempool_t * pool, const struct f_str_s *src,
+ const gchar *loc)
{
gchar *newstr;
@@ -554,7 +569,7 @@ rspamd_mempool_fstrdup (rspamd_mempool_t * pool, const struct f_str_s *src)
return NULL;
}
- newstr = rspamd_mempool_alloc (pool, src->len + 1);
+ newstr = rspamd_mempool_alloc_ (pool, src->len + 1, loc);
memcpy (newstr, src->str, src->len);
newstr[src->len] = '\0';
@@ -562,7 +577,8 @@ rspamd_mempool_fstrdup (rspamd_mempool_t * pool, const struct f_str_s *src)
}
gchar *
-rspamd_mempool_ftokdup (rspamd_mempool_t *pool, const rspamd_ftok_t *src)
+rspamd_mempool_ftokdup_ (rspamd_mempool_t *pool, const rspamd_ftok_t *src,
+ const gchar *loc)
{
gchar *newstr;
@@ -570,7 +586,7 @@ rspamd_mempool_ftokdup (rspamd_mempool_t *pool, const rspamd_ftok_t *src)
return NULL;
}
- newstr = rspamd_mempool_alloc (pool, src->len + 1);
+ newstr = rspamd_mempool_alloc_ (pool, src->len + 1, loc);
memcpy (newstr, src->begin, src->len);
newstr[src->len] = '\0';
@@ -587,7 +603,7 @@ rspamd_mempool_add_destructor_full (rspamd_mempool_t * pool,
struct _pool_destructors *cur;
POOL_MTX_LOCK ();
- cur = rspamd_mempool_alloc (pool, sizeof (*cur));
+ cur = rspamd_mempool_alloc_ (pool, sizeof (*cur), line);
cur->func = func;
cur->data = data;
cur->function = function;
diff --git a/src/libutil/mem_pool.h b/src/libutil/mem_pool.h
index 75e949985..773be33d3 100644
--- a/src/libutil/mem_pool.h
+++ b/src/libutil/mem_pool.h
@@ -137,9 +137,11 @@ typedef struct memory_pool_stat_s {
* @param size size of pool's page
* @return new memory pool object
*/
-rspamd_mempool_t *rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar *loc);
+rspamd_mempool_t *rspamd_mempool_new_ (gsize size, const gchar *tag, gint flags,
+ const gchar *loc);
-#define rspamd_mempool_new(size, tag) rspamd_mempool_new_((size), (tag), G_STRLOC)
+#define rspamd_mempool_new(size, tag, flags) \
+ rspamd_mempool_new_((size), (tag), (flags), G_STRLOC)
/**
* Get memory from pool
@@ -147,8 +149,10 @@ rspamd_mempool_t *rspamd_mempool_new_ (gsize size, const gchar *tag, const gchar
* @param size bytes to allocate
* @return pointer to allocated object
*/
-void *rspamd_mempool_alloc (rspamd_mempool_t *pool, gsize size)
+void *rspamd_mempool_alloc_ (rspamd_mempool_t *pool, gsize size, const gchar *loc)
RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
+#define rspamd_mempool_alloc(pool, size) \
+ rspamd_mempool_alloc_((pool), (size), G_STRLOC)
/**
* Get memory and set it to zero
@@ -156,8 +160,10 @@ RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR
* @param size bytes to allocate
* @return pointer to allocated object
*/
-void *rspamd_mempool_alloc0 (rspamd_mempool_t *pool, gsize size)
+void *rspamd_mempool_alloc0_ (rspamd_mempool_t *pool, gsize size, const gchar *loc)
RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
+#define rspamd_mempool_alloc0(pool, size) \
+ rspamd_mempool_alloc0_((pool), (size), G_STRLOC)
/**
* Make a copy of string in pool
@@ -165,8 +171,10 @@ RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR
* @param src source string
* @return pointer to newly created string that is copy of src
*/
-gchar *rspamd_mempool_strdup (rspamd_mempool_t *pool, const gchar *src)
+gchar *rspamd_mempool_strdup_ (rspamd_mempool_t *pool, const gchar *src, const gchar *loc)
RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT);
+#define rspamd_mempool_strdup(pool, src) \
+ rspamd_mempool_strdup_ ((pool), (src), G_STRLOC)
/**
* Make a copy of fixed string in pool as null terminated string
@@ -174,8 +182,12 @@ RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT);
* @param src source string
* @return pointer to newly created string that is copy of src
*/
-gchar *rspamd_mempool_fstrdup (rspamd_mempool_t *pool,
- const struct f_str_s *src) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT);
+gchar *rspamd_mempool_fstrdup_ (rspamd_mempool_t *pool,
+ const struct f_str_s *src,
+ const gchar *loc)
+RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT);
+#define rspamd_mempool_fstrdup(pool, src) \
+ rspamd_mempool_fstrdup_ ((pool), (src), G_STRLOC)
struct f_str_tok;
@@ -185,19 +197,27 @@ struct f_str_tok;
* @param src source string
* @return pointer to newly created string that is copy of src
*/
-gchar *rspamd_mempool_ftokdup (rspamd_mempool_t *pool,
- const struct f_str_tok *src) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT);
+gchar *rspamd_mempool_ftokdup_ (rspamd_mempool_t *pool,
+ const struct f_str_tok *src,
+ const gchar *loc)
+RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT);
+#define rspamd_mempool_ftokdup(pool, src) \
+ rspamd_mempool_ftokdup_ ((pool), (src), G_STRLOC)
/**
* Allocate piece of shared memory
* @param pool memory pool object
* @param size bytes to allocate
*/
-void *rspamd_mempool_alloc_shared (rspamd_mempool_t *pool, gsize size)
+void *rspamd_mempool_alloc_shared_ (rspamd_mempool_t *pool, gsize size, const gchar *loc)
RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
+#define rspamd_mempool_alloc_shared(pool, size) \
+ rspamd_mempool_alloc_shared_((pool), (size), G_STRLOC)
-void *rspamd_mempool_alloc0_shared (rspamd_mempool_t *pool, gsize size)
+void *rspamd_mempool_alloc0_shared_ (rspamd_mempool_t *pool, gsize size, const gchar *loc)
RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL;
+#define rspamd_mempool_alloc0_shared(pool, size) \
+ rspamd_mempool_alloc0_shared_((pool), (size), G_STRLOC)
/**
* Add destructor callback to pool
diff --git a/src/libutil/mem_pool_internal.h b/src/libutil/mem_pool_internal.h
index c96287a68..1f253e790 100644
--- a/src/libutil/mem_pool_internal.h
+++ b/src/libutil/mem_pool_internal.h
@@ -60,10 +60,11 @@ struct rspamd_mempool_specific {
struct _pool_destructors *dtors_head, *dtors_tail;
GPtrArray *trash_stack;
GHashTable *variables; /**< private memory pool variables */
+ struct rspamd_mempool_entry_point *entry;
gsize elt_len; /**< size of an element */
gsize used_memory;
- gsize wasted_memory;
- struct rspamd_mempool_entry_point *entry;
+ guint wasted_memory;
+ gint flags;
};
/**
diff --git a/src/libutil/radix.c b/src/libutil/radix.c
index 3ea6c6b8c..8eb05cd1f 100644
--- a/src/libutil/radix.c
+++ b/src/libutil/radix.c
@@ -130,7 +130,7 @@ radix_create_compressed (void)
return NULL;
}
- tree->pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL);
+ tree->pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL, 0);
tree->size = 0;
tree->duplicates = 0;
tree->tree = btrie_init (tree->pool);
diff --git a/src/libutil/upstream.c b/src/libutil/upstream.c
index 7d8b81048..196d9cde8 100644
--- a/src/libutil/upstream.c
+++ b/src/libutil/upstream.c
@@ -258,7 +258,7 @@ rspamd_upstreams_library_init (void)
ctx = g_malloc0 (sizeof (*ctx));
memcpy (&ctx->limits, &default_limits, sizeof (ctx->limits));
ctx->pool = rspamd_mempool_new (rspamd_mempool_suggest_size (),
- "upstreams");
+ "upstreams", 0);
ctx->upstreams = g_queue_new ();
REF_INIT_RETAIN (ctx, rspamd_upstream_ctx_dtor);