OSDN Git Service

It's 2011 now.
[qt-creator-jp/qt-creator-jp.git] / src / shared / cplusplus / MemoryPool.cpp
1 /**************************************************************************
2 **
3 ** This file is part of Qt Creator
4 **
5 ** Copyright (c) 2011 Nokia Corporation and/or its subsidiary(-ies).
6 **
7 ** Contact: Nokia Corporation (qt-info@nokia.com)
8 **
9 ** No Commercial Usage
10 **
11 ** This file contains pre-release code and may not be distributed.
12 ** You may use this file in accordance with the terms and conditions
13 ** contained in the Technology Preview License Agreement accompanying
14 ** this package.
15 **
16 ** GNU Lesser General Public License Usage
17 **
18 ** Alternatively, this file may be used under the terms of the GNU Lesser
19 ** General Public License version 2.1 as published by the Free Software
20 ** Foundation and appearing in the file LICENSE.LGPL included in the
21 ** packaging of this file.  Please review the following information to
22 ** ensure the GNU Lesser General Public License version 2.1 requirements
23 ** will be met: http://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
24 **
25 ** In addition, as a special exception, Nokia gives you certain additional
26 ** rights.  These rights are described in the Nokia Qt LGPL Exception
27 ** version 1.1, included in the file LGPL_EXCEPTION.txt in this package.
28 **
29 ** If you have questions regarding the use of this file, please contact
30 ** Nokia at qt-info@nokia.com.
31 **
32 **************************************************************************/
33 // Copyright (c) 2008 Roberto Raggi <roberto.raggi@gmail.com>
34 //
35 // Permission is hereby granted, free of charge, to any person obtaining a copy
36 // of this software and associated documentation files (the "Software"), to deal
37 // in the Software without restriction, including without limitation the rights
38 // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
39 // copies of the Software, and to permit persons to whom the Software is
40 // furnished to do so, subject to the following conditions:
41 //
42 // The above copyright notice and this permission notice shall be included in
43 // all copies or substantial portions of the Software.
44 //
45 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
46 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
47 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
48 // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
49 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
50 // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
51 // THE SOFTWARE.
52
53 #include "MemoryPool.h"
54 #include <cstring>
55 #include <cassert>
56
57 using namespace CPlusPlus;
58
59 MemoryPool::MemoryPool()
60     : _blocks(0),
61       _allocatedBlocks(0),
62       _blockCount(-1),
63       _ptr(0),
64       _end(0)
65 { }
66
67 MemoryPool::~MemoryPool()
68 {
69     if (_blocks) {
70         for (int i = 0; i < _allocatedBlocks; ++i) {
71             if (char *b = _blocks[i])
72                 std::free(b);
73         }
74
75         std::free(_blocks);
76     }
77 }
78
79 void MemoryPool::reset()
80 {
81     _blockCount = -1;
82     _ptr = _end = 0;
83 }
84
85 void *MemoryPool::allocate_helper(size_t size)
86 {
87     assert(size < BLOCK_SIZE);
88
89     if (++_blockCount == _allocatedBlocks) {
90         if (! _allocatedBlocks)
91             _allocatedBlocks = DEFAULT_BLOCK_COUNT;
92         else
93             _allocatedBlocks *= 2;
94
95         _blocks = (char **) realloc(_blocks, sizeof(char *) * _allocatedBlocks);
96
97         for (int index = _blockCount; index < _allocatedBlocks; ++index)
98             _blocks[index] = 0;
99     }
100
101     char *&block = _blocks[_blockCount];
102
103     if (! block)
104         block = (char *) std::malloc(BLOCK_SIZE);
105
106     _ptr = block;
107     _end = _ptr + BLOCK_SIZE;
108
109     void *addr = _ptr;
110     _ptr += size;
111     return addr;
112 }
113
114 RecursiveMemoryPool::RecursiveMemoryPool(MemoryPool *pool)
115     : _pool(pool),
116       _blockCount(pool->_blockCount),
117       _ptr(pool->_ptr),
118       _end(pool->_end)
119 {
120 }
121
122 RecursiveMemoryPool::~RecursiveMemoryPool()
123 {
124     _pool->_blockCount = _blockCount;
125     _pool->_ptr = _ptr;
126     _pool->_end = _end;
127 }
128
129 Managed::Managed()
130 { }
131
132 Managed::~Managed()
133 { }
134
135 void *Managed::operator new(size_t size, MemoryPool *pool)
136 { return pool->allocate(size); }
137
138 void Managed::operator delete(void *)
139 { }
140
141 void Managed::operator delete(void *, MemoryPool *)
142 { }
143