diff --git a/src/libs/glsl/glslmemorypool.cpp b/src/libs/glsl/glslmemorypool.cpp new file mode 100644 index 00000000000..c2927e888f5 --- /dev/null +++ b/src/libs/glsl/glslmemorypool.cpp @@ -0,0 +1,120 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ + +#include "glslmemorypool.h" +#include +#include + +using namespace GLSL; + +MemoryPool::MemoryPool() + : _blocks(0), + _allocatedBlocks(0), + _blockCount(-1), + _ptr(0), + _end(0) +{ } + +MemoryPool::~MemoryPool() +{ + if (_blocks) { + for (int i = 0; i < _allocatedBlocks; ++i) { + if (char *b = _blocks[i]) + std::free(b); + } + + std::free(_blocks); + } +} + +void MemoryPool::reset() +{ + _blockCount = -1; + _ptr = _end = 0; +} + +void *MemoryPool::allocate_helper(size_t size) +{ + assert(size < BLOCK_SIZE); + + if (++_blockCount == _allocatedBlocks) { + if (! _allocatedBlocks) + _allocatedBlocks = DEFAULT_BLOCK_COUNT; + else + _allocatedBlocks *= 2; + + _blocks = (char **) realloc(_blocks, sizeof(char *) * _allocatedBlocks); + + for (int index = _blockCount; index < _allocatedBlocks; ++index) + _blocks[index] = 0; + } + + char *&block = _blocks[_blockCount]; + + if (! block) + block = (char *) std::malloc(BLOCK_SIZE); + + _ptr = block; + _end = _ptr + BLOCK_SIZE; + + void *addr = _ptr; + _ptr += size; + return addr; +} + +RecursiveMemoryPool::RecursiveMemoryPool(MemoryPool *pool) + : _pool(pool), + _blockCount(pool->_blockCount), + _ptr(pool->_ptr), + _end(pool->_end) +{ +} + +RecursiveMemoryPool::~RecursiveMemoryPool() +{ + _pool->_blockCount = _blockCount; + _pool->_ptr = _ptr; + _pool->_end = _end; +} + +Managed::Managed() +{ } + +Managed::~Managed() +{ } + +void *Managed::operator new(size_t size, MemoryPool *pool) +{ return pool->allocate(size); } + +void Managed::operator delete(void *) +{ } + +void Managed::operator delete(void *, MemoryPool *) +{ } + diff --git a/src/libs/glsl/glslmemorypool.h b/src/libs/glsl/glslmemorypool.h new file mode 100644 index 00000000000..9f89d6f72cc --- /dev/null +++ b/src/libs/glsl/glslmemorypool.h @@ -0,0 +1,110 @@ +/************************************************************************** +** +** This file is part of Qt Creator +** +** Copyright (c) 2010 Nokia Corporation and/or its subsidiary(-ies). +** +** Contact: Nokia Corporation (qt-info@nokia.com) +** +** Commercial Usage +** +** Licensees holding valid Qt Commercial licenses may use this file in +** accordance with the Qt Commercial License Agreement provided with the +** Software or, alternatively, in accordance with the terms contained in +** a written agreement between you and Nokia. +** +** GNU Lesser General Public License Usage +** +** Alternatively, this file may be used under the terms of the GNU Lesser +** General Public License version 2.1 as published by the Free Software +** Foundation and appearing in the file LICENSE.LGPL included in the +** packaging of this file. Please review the following information to +** ensure the GNU Lesser General Public License version 2.1 requirements +** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html. +** +** If you are unsure which license is appropriate for your use, please +** contact the sales department at http://qt.nokia.com/contact. +** +**************************************************************************/ +#ifndef GLSLMEMORYPOOL_H +#define GLSLMEMORYPOOL_H + +#include "glsl.h" +#include + +namespace GLSL { + +class MemoryPool; +class RecursiveMemoryPool; + +class GLSL_EXPORT MemoryPool +{ + MemoryPool(const MemoryPool &other); + void operator =(const MemoryPool &other); + +public: + MemoryPool(); + ~MemoryPool(); + + void reset(); + + inline void *allocate(size_t size) + { + size = (size + 7) & ~7; + if (_ptr && (_ptr + size < _end)) { + void *addr = _ptr; + _ptr += size; + return addr; + } + return allocate_helper(size); + } + +private: + void *allocate_helper(size_t size); + +private: + char **_blocks; + int _allocatedBlocks; + int _blockCount; + char *_ptr; + char *_end; + + enum + { + BLOCK_SIZE = 8 * 1024, + DEFAULT_BLOCK_COUNT = 8 + }; + + friend class RecursiveMemoryPool; +}; + +class GLSL_EXPORT RecursiveMemoryPool +{ + MemoryPool *_pool; + int _blockCount; + char *_ptr; + char *_end; + +public: + RecursiveMemoryPool(MemoryPool *pool); + ~RecursiveMemoryPool(); +}; + +class GLSL_EXPORT Managed +{ + Managed(const Managed &other); + void operator = (const Managed &other); + +public: + Managed(); + virtual ~Managed(); + + void *operator new(size_t size, MemoryPool *pool); + void operator delete(void *); + void operator delete(void *, MemoryPool *); +}; + +} // end of namespace GLSL + + +#endif // GLSLMEMORYPOOL_H