#ifndef MEMPOOL_H
#define MEMPOOL_H
#include "macros.h"
/* When DEBUG is enabled, Dovecot warns whenever a memory pool is grown.
This is done so that the initial pool size could be set large enough so that
it wouldn't grow in normal use. For some memory pools it's too difficult
to calculate a good initial size, so this prefix should be used with those
pools to disable the warning. */
/* Memory allocated and reallocated (the new data in it) in pools is always
zeroed, it will cost only a few CPU cycles and may well save some debug
time. */
struct pool_vfuncs {
/* memory in old_size..new_size will be zeroed */
/* Frees all the memory in pool. NOTE: system_pool doesn't support
this and crashes if it's used */
/* Returns the maximum amount of bytes that can be allocated with
minimal trouble. If there's no such concept, always returns 0. */
};
struct pool {
const struct pool_vfuncs *v;
};
/* system_pool uses calloc() + realloc() + free() */
extern pool_t system_pool;
extern struct pool static_system_pool;
/* memory allocated from data_stack is valid only until next t_pop() call.
No checks are performed. */
extern pool_t unsafe_data_stack_pool;
/* Create a new alloc-only pool. Note that `size' specifies the initial
malloc()ed block size, part of it is used internally. */
/* Like alloconly pool, but clear the memory before freeing it. The idea is
that you could allocate memory for storing sensitive information from this
pool, and be sure that it gets cleared from the memory when it's no longer
needed. */
/* When allocating memory from returned pool, the data stack frame must be
the same as it was when calling this function. pool_unref() also checks
that the stack frame is the same. This should make it quite safe to use. */
pool_t pool_datastack_create(void);
/* Create new alloc pool. This is very similar to system pool, but it
will deallocate all memory on deinit. */
/* Like alloc pool, but all memory is cleaned before freeing.
See pool_alloconly_create_clean. */
/* Similar to nearest_power(), but try not to exceed buffer's easy
allocation size. If you don't have any explicit minimum size, use
old_size + 1. */
/* We require sizeof(type) to be <= UINT_MAX. This allows compiler to optimize
away the entire MALLOC_MULTIPLY() call on 64bit systems. */
static inline void * ATTR_MALLOC ATTR_RETURNS_NONNULL
{
}
static inline void * ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
{
}
/* Free the memory. p_free() and p_free_and_null() are now guaranteed to both
set mem=NULL, so either one of them can be used. */
STMT_START { \
} STMT_END
{
}
{
}
{
}
{
}
{
}
{
}
/* These functions are only for pools created with pool_alloconly_create(): */
/* Returns how much memory has been allocated from this pool. */
/* Returns how much system memory has been allocated for this pool. */
/* Returns how much memory has been allocated from this pool. */
/* Returns how much system memory has been allocated for this pool. */
/* private: */
#endif