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_internal.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_internal.h')
-rw-r--r-- | src/libutil/mem_pool_internal.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/src/libutil/mem_pool_internal.h b/src/libutil/mem_pool_internal.h new file mode 100644 index 000000000..9341fce08 --- /dev/null +++ b/src/libutil/mem_pool_internal.h @@ -0,0 +1,81 @@ +/*- + * 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. + */ + +#ifndef RSPAMD_MEM_POOL_INTERNAL_H +#define RSPAMD_MEM_POOL_INTERNAL_H + +/* + * Internal memory pool stuff + */ + +#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_SHARED, + RSPAMD_MEMPOOL_MAX +}; +#define ENTRY_LEN 128 +#define ENTRY_NELTS 64 + +struct entry_elt { + guint32 fragmentation; + guint32 leftover; +}; + +struct rspamd_mempool_entry_point { + gchar src[ENTRY_LEN]; + guint32 cur_suggestion; + guint32 cur_elts; + struct entry_elt elts[ENTRY_NELTS]; +}; + +/** + * 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 */ + struct _pool_destructors *next; +}; + +struct rspamd_mempool_specific { + struct _pool_chain *pools[RSPAMD_MEMPOOL_MAX]; + struct _pool_destructors *dtors_head, *dtors_tail; + 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; +}; + +/** + * 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; +}; + + +#endif |