diff options
author | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-12-23 15:14:02 +0000 |
---|---|---|
committer | Vsevolod Stakhov <vsevolod@highsecure.ru> | 2019-12-23 15:14:02 +0000 |
commit | e9dd8a1fa2841fa0e2a4bb983b74c738cbc8ef68 (patch) | |
tree | cc34d8a6a2e6e466918b20019ddfdd1a08af7832 /src/libutil/mem_pool.h | |
parent | 9ac29d2a364575a7c58510d60dd739e42701e509 (diff) | |
download | rspamd-e9dd8a1fa2841fa0e2a4bb983b74c738cbc8ef68.tar.gz rspamd-e9dd8a1fa2841fa0e2a4bb983b74c738cbc8ef68.zip |
[Project] Start reworking of the mempool structure
- Hide implementation details
- Pre-allocate one chain on start
- Organize destructors as a list of structures
- Use posix_memalign instead of malloc
- Adjust allocation layout
Diffstat (limited to 'src/libutil/mem_pool.h')
-rw-r--r-- | src/libutil/mem_pool.h | 92 |
1 files changed, 30 insertions, 62 deletions
diff --git a/src/libutil/mem_pool.h b/src/libutil/mem_pool.h index a32aa0597..75e949985 100644 --- a/src/libutil/mem_pool.h +++ b/src/libutil/mem_pool.h @@ -1,3 +1,19 @@ +/*- + * Copyright 2019 Vsevolod Stakhov + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + /** * @file mem_pool.h * \brief Memory pools library. @@ -50,17 +66,8 @@ struct f_str_s; #define MEMPOOL_TAG_LEN 20 #define MEMPOOL_UID_LEN 20 +/* All pointers are aligned as this variable */ #define MIN_MEM_ALIGNMENT sizeof (guint64) -#define align_ptr(p, a) \ - (guint8 *) (((uintptr_t) (p) + ((uintptr_t) a - 1)) & ~((uintptr_t) a - 1)) - -enum rspamd_mempool_chain_type { - RSPAMD_MEMPOOL_NORMAL = 0, - RSPAMD_MEMPOOL_TMP, - RSPAMD_MEMPOOL_SHARED, - RSPAMD_MEMPOOL_MAX -}; - /** * Destructor type definition */ @@ -88,27 +95,6 @@ typedef pthread_rwlock_t rspamd_mempool_rwlock_t; #endif /** - * Pool page structure - */ -struct _pool_chain { - guint8 *begin; /**< begin of pool chain block */ - guint8 *pos; /**< current start of free space in block */ - gsize slice_size; /**< length of block */ - rspamd_mempool_mutex_t *lock; - struct _pool_chain *next; -}; - -/** - * Destructors list item structure - */ -struct _pool_destructors { - rspamd_mempool_destruct_t func; /**< pointer to destructor */ - void *data; /**< data to free */ - const gchar *function; /**< function from which this destructor was added */ - const gchar *loc; /**< line number */ -}; - -/** * Tag to use for logging purposes */ struct rspamd_mempool_tag { @@ -116,20 +102,18 @@ struct rspamd_mempool_tag { gchar uid[MEMPOOL_UID_LEN]; /**< unique id */ }; +enum rspamd_mempool_flags { + RSPAMD_MEMPOOL_DEBUG = (1u << 0u), +}; + /** * Memory pool type */ struct rspamd_mempool_entry_point; struct rspamd_mutex_s; +struct rspamd_mempool_specific; typedef struct memory_pool_s { - struct _pool_chain *pools[RSPAMD_MEMPOOL_MAX]; - GArray *destructors; - GPtrArray *trash_stack; - GHashTable *variables; /**< private memory pool variables */ - gsize elt_len; /**< size of an element */ - gsize used_memory; - gsize wasted_memory; - struct rspamd_mempool_entry_point *entry; + struct rspamd_mempool_specific *priv; struct rspamd_mempool_tag tag; /**< memory pool tag */ } rspamd_mempool_t; @@ -167,14 +151,6 @@ void *rspamd_mempool_alloc (rspamd_mempool_t *pool, gsize size) RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL; /** - * Get memory from temporary pool - * @param pool memory pool object - * @param size bytes to allocate - * @return pointer to allocated object - */ -void *rspamd_mempool_alloc_tmp (rspamd_mempool_t *pool, gsize size) RSPAMD_ATTR_RETURNS_NONNUL; - -/** * Get memory and set it to zero * @param pool memory pool object * @param size bytes to allocate @@ -184,19 +160,6 @@ void *rspamd_mempool_alloc0 (rspamd_mempool_t *pool, gsize size) RSPAMD_ATTR_ALLOC_SIZE(2) RSPAMD_ATTR_ALLOC_ALIGN(MIN_MEM_ALIGNMENT) RSPAMD_ATTR_RETURNS_NONNUL; /** - * Get memory and set it to zero - * @param pool memory pool object - * @param size bytes to allocate - * @return pointer to allocated object - */ -void *rspamd_mempool_alloc0_tmp (rspamd_mempool_t *pool, gsize size) RSPAMD_ATTR_RETURNS_NONNUL; - -/** - * Cleanup temporary data in pool - */ -void rspamd_mempool_cleanup_tmp (rspamd_mempool_t *pool); - -/** * Make a copy of string in pool * @param pool memory pool object * @param src source string @@ -344,6 +307,9 @@ void rspamd_mempool_stat_reset (void); gsize rspamd_mempool_suggest_size_ (const char *loc); +gsize rspamd_mempool_get_used_size (rspamd_mempool_t *pool); +gsize rspamd_mempool_get_wasted_size (rspamd_mempool_t *pool); + /** * Set memory pool variable * @param pool memory pool object @@ -351,8 +317,10 @@ gsize rspamd_mempool_suggest_size_ (const char *loc); * @param gpointer value value of variable * @param destructor pointer to function-destructor */ -void rspamd_mempool_set_variable (rspamd_mempool_t *pool, const gchar *name, - gpointer value, rspamd_mempool_destruct_t destructor); +void rspamd_mempool_set_variable (rspamd_mempool_t *pool, + const gchar *name, + gpointer value, + rspamd_mempool_destruct_t destructor); /** * Get memory pool variable |