diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-08-27 17:31:29 +0100 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2015-08-27 17:36:29 +0100 |
commit | b05c7c9edd197eea8aa11abcc416ea1463748f98 (patch) | |
tree | 06c165d661c28a1246cd23a3752bd172787701d7 /src/libutil | |
parent | bbdc006ee99784d31d4b1df3290f1a63fd4086e5 (diff) | |
download | rspamd-b05c7c9edd197eea8aa11abcc416ea1463748f98.tar.gz rspamd-b05c7c9edd197eea8aa11abcc416ea1463748f98.zip |
Add tags to rspamd_mempool.
Diffstat (limited to 'src/libutil')
-rw-r--r-- | src/libutil/logger.c | 2 | ||||
-rw-r--r-- | src/libutil/map.c | 4 | ||||
-rw-r--r-- | src/libutil/mem_pool.c | 22 | ||||
-rw-r--r-- | src/libutil/mem_pool.h | 11 | ||||
-rw-r--r-- | src/libutil/radix.c | 2 |
5 files changed, 35 insertions, 6 deletions
diff --git a/src/libutil/logger.c b/src/libutil/logger.c index 1cf348489..87a8781e8 100644 --- a/src/libutil/logger.c +++ b/src/libutil/logger.c @@ -294,7 +294,7 @@ rspamd_set_logger (struct rspamd_config *cfg, rspamd->logger = g_malloc (sizeof (rspamd_logger_t)); memset (rspamd->logger, 0, sizeof (rspamd_logger_t)); /* Small pool for interlocking */ - rspamd->logger->pool = rspamd_mempool_new (512); + rspamd->logger->pool = rspamd_mempool_new (512, NULL); rspamd->logger->mtx = rspamd_mempool_get_mutex (rspamd->logger->pool); } diff --git a/src/libutil/map.c b/src/libutil/map.c index 72f3a78b3..65ebb076e 100644 --- a/src/libutil/map.c +++ b/src/libutil/map.c @@ -471,7 +471,7 @@ rspamd_map_add (struct rspamd_config *cfg, } /* Constant pool */ if (cfg->map_pool == NULL) { - cfg->map_pool = rspamd_mempool_new (rspamd_mempool_suggest_size ()); + cfg->map_pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL); } new_map = rspamd_mempool_alloc0 (cfg->map_pool, sizeof (struct rspamd_map)); new_map->read_callback = read_callback; @@ -588,7 +588,7 @@ rspamd_map_add (struct rspamd_config *cfg, new_map->map_data = hdata; } /* Temp pool */ - new_map->pool = rspamd_mempool_new (rspamd_mempool_suggest_size ()); + new_map->pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL); cfg->maps = g_list_prepend (cfg->maps, new_map); diff --git a/src/libutil/mem_pool.c b/src/libutil/mem_pool.c index 81487e49c..084b4400b 100644 --- a/src/libutil/mem_pool.c +++ b/src/libutil/mem_pool.c @@ -29,6 +29,7 @@ #include "util.h" #include "main.h" #include "utlist.h" +#include "ottery.h" /* Sleep time for spin lock in nanoseconds */ #define MUTEX_SLEEP_TIME 10000000L @@ -152,10 +153,13 @@ pool_chain_new_shared (gsize size) * @return new memory pool object */ rspamd_mempool_t * -rspamd_mempool_new (gsize size) +rspamd_mempool_new (gsize size, const gchar *tag) { rspamd_mempool_t *new; gpointer map; + unsigned char uidbuf[10]; + const gchar hexdigits[] = "0123456789abcdef"; + unsigned i; g_return_val_if_fail (size > 0, NULL); /* Allocate statistic structure if it is not allocated before */ @@ -215,6 +219,22 @@ rspamd_mempool_new (gsize size) /* Set it upon first call of set variable */ new->variables = NULL; new->elt_len = size; + + if (tag) { + rspamd_strlcpy (new->tag.tagname, tag, sizeof (new->tag.tagname)); + } + else { + new->tag.tagname[0] = '\0'; + } + + /* Generate new uid */ + ottery_rand_bytes (uidbuf, sizeof (uidbuf)); + for (i = 0; i < G_N_ELEMENTS (uidbuf); i ++) { + new->tag.uid[i * 2] = hexdigits[(uidbuf[i] >> 4) & 0xf]; + new->tag.uid[i * 2 + 2] = hexdigits[uidbuf[i] & 0xf]; + } + new->tag.uid[19] = '\0'; + mem_pool_stat->pools_allocated++; return new; diff --git a/src/libutil/mem_pool.h b/src/libutil/mem_pool.h index 1befd8445..42df30148 100644 --- a/src/libutil/mem_pool.h +++ b/src/libutil/mem_pool.h @@ -82,6 +82,14 @@ struct _pool_destructors { }; /** + * Tag to use for logging purposes + */ +struct rspamd_mempool_tag { + gchar tagname[20]; /**< readable name */ + gchar uid[20]; /**< unique id */ +}; + +/** * Memory pool type */ struct rspamd_mutex_s; @@ -92,6 +100,7 @@ typedef struct memory_pool_s { struct _pool_destructors *destructors; /**< destructors chain */ GHashTable *variables; /**< private memory pool variables */ gsize elt_len; /**< size of an element */ + struct rspamd_mempool_tag tag; /**< memory pool tag */ } rspamd_mempool_t; /** @@ -114,7 +123,7 @@ 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); +rspamd_mempool_t *rspamd_mempool_new (gsize size, const gchar *tag); /** * Get memory from pool diff --git a/src/libutil/radix.c b/src/libutil/radix.c index 39fc39445..0d51d77f7 100644 --- a/src/libutil/radix.c +++ b/src/libutil/radix.c @@ -527,7 +527,7 @@ radix_create_compressed (void) return NULL; } - tree->pool = rspamd_mempool_new (rspamd_mempool_suggest_size ()); + tree->pool = rspamd_mempool_new (rspamd_mempool_suggest_size (), NULL); tree->size = 0; tree->root = NULL; |