mempool-system.c revision dd0fd94add215d793a6869215c0509308b94c877
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen/* Copyright (c) 2002-2003 Timo Sirainen */
c25356d5978632df6203437e1953bcb29e0c736fTimo Sirainen
c0a708fa3f7b8f4fbca32052da5faf7a0125189dTimo Sirainen/* @UNSAFE: whole file */
bdd36cfdba3ff66d25570a9ff568d69e1eb543cfTimo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#include "lib.h"
c49a19168dab6fda80aee16ad799a8a56d3bc18fTimo Sirainen#include "mempool.h"
b55f914c0ade77252cfd798ea8eb9a84bda56315Timo Sirainen
c0a708fa3f7b8f4fbca32052da5faf7a0125189dTimo Sirainen#include <stdlib.h>
82fb1ead38f4e1197993adb2f9c12e26531e9c92Timo Sirainen
decb23442f9e6cd5c4845a9cb162029b8c6d5f0fTimo Sirainen#ifdef HAVE_GC_GC_H
decb23442f9e6cd5c4845a9cb162029b8c6d5f0fTimo Sirainen# include <gc/gc.h>
cd94aeaa294f7cc507206b4b2075852f00e14d61Timo Sirainen#elif defined (HAVE_GC_H)
cd94aeaa294f7cc507206b4b2075852f00e14d61Timo Sirainen# include <gc.h>
decb23442f9e6cd5c4845a9cb162029b8c6d5f0fTimo Sirainen#endif
decb23442f9e6cd5c4845a9cb162029b8c6d5f0fTimo Sirainen
cd94aeaa294f7cc507206b4b2075852f00e14d61Timo Sirainenstatic const char *pool_system_get_name(pool_t pool);
cd94aeaa294f7cc507206b4b2075852f00e14d61Timo Sirainenstatic void pool_system_ref(pool_t pool);
decb23442f9e6cd5c4845a9cb162029b8c6d5f0fTimo Sirainenstatic void pool_system_unref(pool_t pool);
b55f914c0ade77252cfd798ea8eb9a84bda56315Timo Sirainenstatic void *pool_system_malloc(pool_t pool, size_t size);
b55f914c0ade77252cfd798ea8eb9a84bda56315Timo Sirainenstatic void pool_system_free(pool_t pool, void *mem);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void *pool_system_realloc(pool_t pool, void *mem,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen size_t old_size, size_t new_size);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void pool_system_clear(pool_t pool);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic size_t pool_system_get_max_easy_alloc_size(pool_t pool);
7fa573e6ea36024f618492e7d3649a69c1b41028Timo Sirainen
7fa573e6ea36024f618492e7d3649a69c1b41028Timo Sirainenstatic struct pool static_system_pool = {
7fa573e6ea36024f618492e7d3649a69c1b41028Timo Sirainen pool_system_get_name,
5a9e240ebf8d0daaf029973973b52e415148070bTimo Sirainen
5a9e240ebf8d0daaf029973973b52e415148070bTimo Sirainen pool_system_ref,
d99107ddf4d9bccb710994482daf65276a9d6321Timo Sirainen pool_system_unref,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen pool_system_malloc,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen pool_system_free,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen pool_system_realloc,
cd94aeaa294f7cc507206b4b2075852f00e14d61Timo Sirainen
a05fec120ecd8c4ed6331c42100cba42adf22893Stephan Bosch pool_system_clear,
a05fec120ecd8c4ed6331c42100cba42adf22893Stephan Bosch pool_system_get_max_easy_alloc_size,
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen FALSE,
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen FALSE
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen};
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainenpool_t system_pool = &static_system_pool;
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainenstatic const char *pool_system_get_name(pool_t pool __attr_unused__)
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen{
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen return "system";
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen}
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainenstatic void pool_system_ref(pool_t pool __attr_unused__)
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen{
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen}
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainenstatic void pool_system_unref(pool_t pool __attr_unused__)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen}
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void *pool_system_malloc(pool_t pool __attr_unused__, size_t size)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
d694a52bce62c52080c3f87a56dcf77030fd2712Timo Sirainen void *mem;
d694a52bce62c52080c3f87a56dcf77030fd2712Timo Sirainen
009217abb57a24a4076092e8e4e165545747839eStephan Bosch if (size == 0 || size > SSIZE_T_MAX)
2598b2f36365b52d9754b9348a5be29569293e46Timo Sirainen i_panic("Trying to allocate %"PRIuSIZE_T" bytes", size);
6303191abcb37164f435ccdc56e9dbddf1288851Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#ifndef USE_GC
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen mem = calloc(size, 1);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#else
ab281fc992907b6cf6c730f672dc3aa4c6685015Timo Sirainen mem = GC_malloc(size);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen memset(mem, 0, size);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#endif
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen if (mem == NULL) {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen i_fatal_status(FATAL_OUTOFMEM,
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen "pool_system_malloc(): Out of memory");
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen }
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen return mem;
f059a046515f4b2b15a6c2a10a6f12f6166e39a5Timo Sirainen}
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainenstatic void pool_system_free(pool_t pool __attr_unused__,
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen void *mem __attr_unused__)
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen{
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen#ifndef USE_GC
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen if (mem != NULL)
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen free(mem);
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen#endif
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen}
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainenstatic void *pool_system_realloc(pool_t pool __attr_unused__, void *mem,
46ec792dd4ccf6c34706c4774228301fafde6aa9Timo Sirainen size_t old_size, size_t new_size)
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen{
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen if (new_size == 0 || new_size > SSIZE_T_MAX)
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen i_panic("Trying to allocate %"PRIuSIZE_T" bytes", new_size);
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen#ifndef USE_GC
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen mem = realloc(mem, new_size);
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen#else
9f627b360ed38fdc54cb02ec5e67246c3f0d5b0fTimo Sirainen mem = GC_realloc(mem, new_size);
00fa8dcbc66f56daa737487c9dec7166c37de79eTimo Sirainen#endif
00fa8dcbc66f56daa737487c9dec7166c37de79eTimo Sirainen if (mem == NULL) {
c0a708fa3f7b8f4fbca32052da5faf7a0125189dTimo Sirainen i_fatal_status(FATAL_OUTOFMEM,
ad004e44be109684521494b5af2ad1da39b8bb27Timo Sirainen "pool_system_realloc(): Out of memory");
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen }
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen if (old_size < new_size) {
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen /* clear new data */
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen memset((char *) mem + old_size, 0, new_size - old_size);
ad004e44be109684521494b5af2ad1da39b8bb27Timo Sirainen }
64e244defe74f513ce94f33d000a048ddbe2ea23Timo Sirainen
c0a708fa3f7b8f4fbca32052da5faf7a0125189dTimo Sirainen return mem;
325d17cdbb7a338f7c413788f5e8e42d2e80a7f8Timo Sirainen}
009217abb57a24a4076092e8e4e165545747839eStephan Bosch
009217abb57a24a4076092e8e4e165545747839eStephan Boschstatic void pool_system_clear(pool_t pool __attr_unused__)
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen{
97db4761382024093f441e4bc78ba8b6a056504dTimo Sirainen i_panic("pool_system_clear() must not be called");
f29756821a4c6b12b73e4a2a3e1c230117a43773Timo Sirainen}
8ce3071e80b9973230048ecadfcb073fb82cc69fTimo Sirainen
bf72c930996df0691932fb1143f360d260f27a06Timo Sirainenstatic size_t pool_system_get_max_easy_alloc_size(pool_t pool __attr_unused__)
c0a708fa3f7b8f4fbca32052da5faf7a0125189dTimo Sirainen{
cd94aeaa294f7cc507206b4b2075852f00e14d61Timo Sirainen return 0;
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen}
e248fe370c4047cee921a91b48edc37944ab0526Timo Sirainen