Reinstated functionality in pstring. This should now be compatible with MSVC.

This commit is contained in:
Couriersud 2013-12-16 11:59:40 +00:00
parent 94b7d45594
commit f50677f13c
2 changed files with 10 additions and 5 deletions

View File

@ -142,6 +142,7 @@ void pstring::resetmem()
pblockpool::pblockpool()
: m_shutdown(false)
, m_first(NULL)
, m_blocksize((DEBUG_MODE) ? 0 : 16384)
, m_align(8)
{
}
@ -153,6 +154,7 @@ void *pblockpool::alloc(const std::size_t n)
return (char *) malloc(n);
else
{
int min_alloc = MAX(m_blocksize, n+sizeof(memblock)-8);
char *ret = NULL;
int memsize = ((n + m_align - 1) / m_align) * m_align;
//std::printf("m_first %p\n", m_first);
@ -170,10 +172,10 @@ void *pblockpool::alloc(const std::size_t n)
if (ret == NULL)
{
// need to allocate a new block
memblock *p = (memblock *) malloc(sizeof(memblock)); //new char[sizeof(memblock)];
memblock *p = (memblock *) malloc(min_alloc); //new char[min_alloc];
p->allocated = 0;
p->cur = &p->data[0];
p->remaining = sizeof(p->data);
p->size = p->remaining = min_alloc - sizeof(memblock);
p->next = m_first;
//std::printf("allocated block size %d\n", sizeof(p->data));
@ -197,7 +199,7 @@ void pblockpool::dealloc(void *ptr)
{
for (memblock *p = m_first; p != NULL; p = p->next)
{
if (ptr >= &p->data[0] && ptr < &p->data[sizeof(p->data)])
if (ptr >= &p->data[0] && ptr < &p->data[p->size])
{
p->allocated -= 1;
if (p->allocated < 0)
@ -205,7 +207,7 @@ void pblockpool::dealloc(void *ptr)
if (p->allocated == 0)
{
//std::printf("Block entirely freed\n");
p->remaining = sizeof(p->data);
p->remaining = p->size;
p->cur = &p->data[0];
}
// shutting down ?

View File

@ -19,10 +19,11 @@ struct pblockpool {
struct memblock
{
memblock *next;
int size;
int allocated;
int remaining;
char *cur;
char data[16384];
char data[8];
};
pblockpool();
@ -41,6 +42,7 @@ struct pblockpool {
bool m_shutdown;
memblock *m_first;
int m_blocksize;
int m_align;
};
@ -57,6 +59,7 @@ inline void *operator new(std::size_t size, pblockpool &pool, int extra = 0) thr
inline void operator delete(void *pMem, pblockpool &pool, int extra)
{
pool.dealloc(pMem);
}
// ----------------------------------------------------------------------------------------