diff -r 9d66d323c354 -r 9af5c039b678 include/mempool.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/include/mempool.h Mon May 05 15:31:14 2008 +0200 @@ -0,0 +1,78 @@ +/* + * mempool.h: memory pool + * + * This file is part of Pyrit Ray Tracer. + * + * Copyright 2008 Radek Brich + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to deal + * in the Software without restriction, including without limitation the rights + * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell + * copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, + * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN + * THE SOFTWARE. + */ + +#ifndef MEMPOOL_H +#define MEMPOOL_H + +#include "common.h" + +template +class MemoryPool +{ + void *mem; + size_t cur, size, typesize, align; + + void init() + { + typesize = ((sizeof(Type)-1)/align+1)*align; +#ifndef NO_SIMD + mem = (Type *)_mm_malloc(size * typesize, align); +#else + mem = (Type *)malloc(inisize * typesize); +#endif + }; +public: + MemoryPool(const size_t inisize): + cur(0), size(inisize), align(16) { init(); }; + MemoryPool(const size_t inisize, const size_t inialign): + cur(0), size(inisize), align(inialign) { init(); }; + ~MemoryPool() + { +#ifndef NO_SIMD + _mm_free(mem); +#else + free(mem); +#endif + }; + + void *alloc() + { + if (cur == size) + { +#ifndef NO_SIMD + void *newmem = _mm_malloc(2 * size * typesize, align); +#else + void *newmem = malloc(2 * size * typesize); +#endif + memcpy(newmem, mem, size * typesize); + mem = newmem; + size *= 2; + } + return (void*)((size_t)mem + typesize*(cur++)); + }; +}; + +#endif