mirror of
https://github.com/moses-smt/mosesdecoder.git
synced 2024-10-27 11:59:52 +03:00
my MemPool
This commit is contained in:
parent
a7c6c9a583
commit
77a2de1d9d
@ -13,6 +13,7 @@ import path ;
|
||||
InputPaths.cpp
|
||||
Main.cpp
|
||||
Manager.cpp
|
||||
MemPool.cpp
|
||||
Phrase.cpp
|
||||
PhraseTable.cpp
|
||||
Scores.cpp
|
||||
|
62
contrib/other-builds/moses2/MemPool.cpp
Normal file
62
contrib/other-builds/moses2/MemPool.cpp
Normal file
@ -0,0 +1,62 @@
|
||||
/*
|
||||
* MemPool.cpp
|
||||
*
|
||||
* Created on: 28 Oct 2015
|
||||
* Author: hieu
|
||||
*/
|
||||
|
||||
#include "MemPool.h"
|
||||
#include "util/scoped.hh"
|
||||
|
||||
MemPool::Page::Page(std::size_t vSize)
|
||||
:size(vSize)
|
||||
{
|
||||
mem = (uint8_t*) util::MallocOrThrow(size);
|
||||
end = mem + size;
|
||||
}
|
||||
|
||||
MemPool::Page::~Page()
|
||||
{
|
||||
|
||||
}
|
||||
////////////////////////////////////////////////////
|
||||
MemPool::MemPool(size_t initSize)
|
||||
:m_currSize(initSize)
|
||||
,m_currPage(0)
|
||||
{
|
||||
m_pages.push_back(Page(m_currSize));
|
||||
}
|
||||
|
||||
MemPool::~MemPool() {
|
||||
|
||||
}
|
||||
|
||||
|
||||
void *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);
|
||||
m_pages.push_back(Page(amount));
|
||||
|
||||
Page &page = m_pages.back();
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
64
contrib/other-builds/moses2/MemPool.h
Normal file
64
contrib/other-builds/moses2/MemPool.h
Normal file
@ -0,0 +1,64 @@
|
||||
/*
|
||||
* MemPool.h
|
||||
*
|
||||
* Created on: 28 Oct 2015
|
||||
* Author: hieu
|
||||
*/
|
||||
|
||||
#ifndef MEMPOOL_H_
|
||||
#define MEMPOOL_H_
|
||||
|
||||
#include <vector>
|
||||
#include <stdint.h>
|
||||
|
||||
class MemPool {
|
||||
struct Page {
|
||||
uint8_t *mem;
|
||||
uint8_t *end;
|
||||
size_t size;
|
||||
|
||||
Page(std::size_t size);
|
||||
~Page();
|
||||
};
|
||||
|
||||
public:
|
||||
MemPool(std::size_t initSize = 10000);
|
||||
|
||||
~MemPool();
|
||||
|
||||
void *Allocate(std::size_t size) {
|
||||
void *ret = current_;
|
||||
current_ += size;
|
||||
|
||||
Page &page = m_pages[m_currPage];
|
||||
if (current_ < page.end) {
|
||||
// return what we got
|
||||
} else {
|
||||
ret = More(size);
|
||||
}
|
||||
return ret;
|
||||
|
||||
}
|
||||
|
||||
template<typename T>
|
||||
T *Allocate(size_t num = 1) {
|
||||
void *ret = Allocate(sizeof(T) * num);
|
||||
return (T*) ret;
|
||||
}
|
||||
|
||||
|
||||
private:
|
||||
void *More(std::size_t size);
|
||||
|
||||
std::vector<Page> m_pages;
|
||||
|
||||
size_t m_currSize;
|
||||
size_t m_currPage;
|
||||
uint8_t *current_;
|
||||
|
||||
// no copying
|
||||
MemPool(const MemPool &);
|
||||
MemPool &operator=(const MemPool &);
|
||||
};
|
||||
|
||||
#endif /* MEMPOOL_H_ */
|
Loading…
Reference in New Issue
Block a user