added pooled memory allocator taking code from tre for tre porting

This commit is contained in:
2011-05-23 09:03:30 +00:00
parent 483ce8b5bb
commit bc941f10db
6 changed files with 270 additions and 17 deletions

View File

@ -8,7 +8,7 @@ AM_CPPFLAGS = \
lib_LTLIBRARIES = libqsecmn.la
libqsecmn_la_SOURCES = \
syscall.h mem.h \
mem.c xma.c fma.c chr.c chr_cnv.c rex.c \
mem.c xma.c fma.c pma.c chr.c chr_cnv.c rex.c \
str_beg.c str_cat.c str_chr.c str_cnv.c str_cmp.c str_cpy.c \
str_del.c str_dup.c str_dynm.c str_dynw.c str_end.c str_excl.c \
str_fcpy.c str_incl.c str_len.c str_pac.c str_pbrk.c str_put.c \

View File

@ -72,16 +72,16 @@ am__base_list = \
am__installdirs = "$(DESTDIR)$(libdir)"
LTLIBRARIES = $(lib_LTLIBRARIES)
libqsecmn_la_DEPENDENCIES =
am_libqsecmn_la_OBJECTS = mem.lo xma.lo fma.lo chr.lo chr_cnv.lo \
rex.lo str_beg.lo str_cat.lo str_chr.lo str_cnv.lo str_cmp.lo \
str_cpy.lo str_del.lo str_dup.lo str_dynm.lo str_dynw.lo \
str_end.lo str_excl.lo str_fcpy.lo str_incl.lo str_len.lo \
str_pac.lo str_pbrk.lo str_put.lo str_rev.lo str_rot.lo \
str_set.lo str_spl.lo str_spn.lo str_str.lo str_subst.lo \
str_tok.lo str_trm.lo str_word.lo lda.lo oht.lo htb.lo rbt.lo \
sll.lo gdl.lo dll.lo opt.lo tio.lo tio_get.lo tio_put.lo \
fio.lo pio.lo sio.lo alg_search.lo alg_sort.lo time.lo misc.lo \
assert.lo main.lo stdio.lo
am_libqsecmn_la_OBJECTS = mem.lo xma.lo fma.lo pma.lo chr.lo \
chr_cnv.lo rex.lo str_beg.lo str_cat.lo str_chr.lo str_cnv.lo \
str_cmp.lo str_cpy.lo str_del.lo str_dup.lo str_dynm.lo \
str_dynw.lo str_end.lo str_excl.lo str_fcpy.lo str_incl.lo \
str_len.lo str_pac.lo str_pbrk.lo str_put.lo str_rev.lo \
str_rot.lo str_set.lo str_spl.lo str_spn.lo str_str.lo \
str_subst.lo str_tok.lo str_trm.lo str_word.lo lda.lo oht.lo \
htb.lo rbt.lo sll.lo gdl.lo dll.lo opt.lo tio.lo tio_get.lo \
tio_put.lo fio.lo pio.lo sio.lo alg_search.lo alg_sort.lo \
time.lo misc.lo assert.lo main.lo stdio.lo
libqsecmn_la_OBJECTS = $(am_libqsecmn_la_OBJECTS)
libqsecmn_la_LINK = $(LIBTOOL) --tag=CC $(AM_LIBTOOLFLAGS) \
$(LIBTOOLFLAGS) --mode=link $(CCLD) $(AM_CFLAGS) $(CFLAGS) \
@ -268,7 +268,7 @@ AM_CPPFLAGS = \
lib_LTLIBRARIES = libqsecmn.la $(am__append_1)
libqsecmn_la_SOURCES = \
syscall.h mem.h \
mem.c xma.c fma.c chr.c chr_cnv.c rex.c \
mem.c xma.c fma.c pma.c chr.c chr_cnv.c rex.c \
str_beg.c str_cat.c str_chr.c str_cnv.c str_cmp.c str_cpy.c \
str_del.c str_dup.c str_dynm.c str_dynw.c str_end.c str_excl.c \
str_fcpy.c str_incl.c str_len.c str_pac.c str_pbrk.c str_put.c \
@ -386,6 +386,7 @@ distclean-compile:
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/oht.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/opt.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pio.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/pma.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rbt.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/rex.Plo@am__quote@
@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/sio.Plo@am__quote@

151
qse/lib/cmn/pma.c Normal file
View File

@ -0,0 +1,151 @@
/*
* $Id$
*
Copyright 2006-2011 Chung, Hyung-Hwan.
This file is part of QSE.
QSE is free software: you can redistribute it and/or modify
it under the terms of the GNU Lesser General Public License as
published by the Free Software Foundation, either version 3 of
the License, or (at your option) any later version.
QSE is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU Lesser General Public License for more details.
You should have received a copy of the GNU Lesser General Public
License along with QSE. If not, see <http://www.gnu.org/licenses/>.
*/
/*
tre-mem.c - TRE memory allocator
This software is released under a BSD-style license.
See the file LICENSE for details and copyright.
*/
/*
This memory allocator is for allocating small memory blocks efficiently
in terms of memory overhead and execution speed. The allocated blocks
cannot be freed individually, only all at once. There can be multiple
allocators, though.
*/
#include <qse/cmn/pma.h>
#include "mem.h"
#define ALIGN(x,size) ((((x) + (size) - 1) / (size)) * (size))
QSE_IMPLEMENT_COMMON_FUNCTIONS (pma)
qse_pma_t* qse_pma_init (qse_pma_t* pma, qse_mmgr_t* mmgr)
{
if (mmgr == QSE_NULL) mmgr = QSE_MMGR_GETDFL();
QSE_MEMSET (pma, 0, QSE_SIZEOF(*pma));
pma->mmgr = mmgr;
return pma;
}
/* Frees the memory allocator and all memory allocated with it. */
void qse_pma_fini (qse_pma_t* pma)
{
qse_pma_blk_t* tmp, * l = pma->blocks;
while (l != QSE_NULL)
{
QSE_MMGR_FREE (pma->mmgr, l->data);
tmp = l->next;
QSE_MMGR_FREE (pma->mmgr, l);
l = tmp;
}
}
/* Returns a new memory allocator or NULL if out of memory. */
qse_pma_t* qse_pma_open (qse_mmgr_t* mmgr, qse_size_t xtnsize)
{
qse_pma_t* pma;
pma = (qse_pma_t*)QSE_MMGR_ALLOC (mmgr, QSE_SIZEOF(*pma) + xtnsize);
if (pma == QSE_NULL) return QSE_NULL;
if (qse_pma_init (pma, mmgr) == QSE_NULL)
{
QSE_MMGR_FREE (mmgr, pma);
return QSE_NULL;
}
return pma;
}
void qse_pma_close (qse_pma_t* pma)
{
qse_pma_fini (pma);
QSE_MMGR_FREE (pma->mmgr, pma);
}
/* Allocates a block of `size' bytes from `mem'. Returns a pointer to the
allocated block or NULL if an underlying malloc() failed. */
void* qse_pma_alloc (qse_pma_t* pma, qse_size_t size)
{
void *ptr;
if (pma->failed) return QSE_NULL;
if (pma->n < size)
{
/* We need more memory than is available in the current block.
Allocate a new block. */
qse_pma_blk_t* l;
int block_size;
if (size * 8 > QSE_PMA_BLOCK_SIZE)
block_size = size * 8;
else
block_size = QSE_PMA_BLOCK_SIZE;
l = QSE_MMGR_ALLOC (pma->mmgr, QSE_SIZEOF(*l));
if (l == QSE_NULL)
{
pma->failed = 1;
return QSE_NULL;
}
l->data = QSE_MMGR_ALLOC (pma->mmgr, block_size);
if (l->data == QSE_NULL)
{
QSE_MMGR_FREE (pma->mmgr, l);
pma->failed = 1;
return QSE_NULL;
}
l->next = QSE_NULL;
if (pma->current != QSE_NULL) pma->current->next = l;
if (pma->blocks == QSE_NULL) pma->blocks = l;
pma->current = l;
pma->ptr = l->data;
pma->n = block_size;
}
/* Make sure the next pointer will be aligned. */
size += ALIGN((long)(pma->ptr + size), QSE_SIZEOF(long));
/* Allocate from current block. */
ptr = pma->ptr;
pma->ptr += size;
pma->n -= size;
return ptr;
}
void* qse_pma_realloc (qse_pma_t* pma, void* blk, qse_size_t size)
{
/* do nothing. you can't resize an individual memory chunk */
return QSE_NULL;
}
void qse_pma_free (qse_pma_t* pma, void* blk)
{
/* do nothing. you can't free an individual memory chunk */
}