blob: 7e159117ba74c5e438aae1e89c4900350611bf09 (
plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
|
/*
* MemPool.cpp
*
* Created on: 28 Oct 2015
* Author: hieu
*/
#include <boost/foreach.hpp>
#include "MemPool.h"
#include "util/scoped.hh"
#include "legacy/Util2.h"
using namespace std;
namespace Moses2
{
MemPool::Page::Page(std::size_t vSize) :
size(vSize)
{
mem = (uint8_t*) util::MallocOrThrow(size);
end = mem + size;
}
MemPool::Page::~Page()
{
free(mem);
}
////////////////////////////////////////////////////
MemPool::MemPool(size_t initSize) :
m_currSize(initSize), m_currPage(0)
{
Page *page = new Page(m_currSize);
m_pages.push_back(page);
current_ = page->mem;
//cerr << "new memory pool";
}
MemPool::~MemPool()
{
//cerr << "delete memory pool" << endl;
RemoveAllInColl(m_pages);
}
uint8_t *MemPool::More(std::size_t size)
{
++m_currPage;
if (m_currPage >= m_pages.size()) {
// add new page
m_currSize <<= 1;
std::size_t amount = std::max(m_currSize, size);
Page *page = new Page(amount);
m_pages.push_back(page);
uint8_t *ret = page->mem;
current_ = ret + size;
return ret;
}
else {
// use existing page
Page &page = *m_pages[m_currPage];
if (size <= page.size) {
uint8_t *ret = page.mem;
current_ = ret + size;
return ret;
}
else {
// recursive call More()
return More(size);
}
}
}
void MemPool::Reset()
{
m_currPage = 0;
current_ = m_pages[0]->mem;
}
}
|