home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Large Pack of OldSkool DOS MOD Trackers
/
goattracker_2.68.zip
/
src
/
asm
/
chnkpool.c
< prev
next >
Wrap
C/C++ Source or Header
|
2008-04-01
|
3KB
|
112 lines
/*
* Copyright (c) 2003 - 2005 Magnus Lind.
*
* This software is provided 'as-is', without any express or implied warranty.
* In no event will the authors be held liable for any damages arising from
* the use of this software.
*
* Permission is granted to anyone to use this software, alter it and re-
* distribute it freely for any non-commercial, non-profit purpose subject to
* the following restrictions:
*
* 1. The origin of this software must not be misrepresented; you must not
* claim that you wrote the original software. If you use this software in a
* product, an acknowledgment in the product documentation would be
* appreciated but is not required.
*
* 2. Altered source versions must be plainly marked as such, and must not
* be misrepresented as being the original software.
*
* 3. This notice may not be removed or altered from any distribution.
*
* 4. The names of this software and/or it's copyright holders may not be
* used to endorse or promote products derived from this software without
* specific prior written permission.
*
*/
#include "chnkpool.h"
#include "log.h"
#include <stdlib.h>
#include <string.h>
void
chunkpool_init(struct chunkpool *ctx, int size)
{
ctx->chunk_size = size;
ctx->chunk = -1;
ctx->chunk_max = (0x1fffff / size) * size;
ctx->chunk_pos = ctx->chunk_max;
}
void
chunkpool_free2(struct chunkpool *ctx, cb_free *f)
{
while(ctx->chunk >= 0)
{
if(f != NULL)
{
do
{
ctx->chunk_pos -= ctx->chunk_size;
f((char*)ctx->chunks[ctx->chunk] + ctx->chunk_pos);
}
while(ctx->chunk_pos > 0);
ctx->chunk_pos = ctx->chunk_max;
}
free(ctx->chunks[ctx->chunk]);
ctx->chunk -= 1;
}
ctx->chunk_size = -1;
ctx->chunk_max = -1;
ctx->chunk_pos = -1;
}
void
chunkpool_free(struct chunkpool *ctx)
{
chunkpool_free2(ctx, NULL);
}
void *
chunkpool_malloc(struct chunkpool *ctx)
{
void *p;
if(ctx->chunk_pos == ctx->chunk_max)
{
void *m;
if(ctx->chunk == CHUNKPOOL_CHUNKS_MAX - 1)
{
LOG(LOG_ERROR, ("out of chunks in file %s, line %d\n",
__FILE__, __LINE__));
LOG(LOG_BRIEF, ("chunk_size %d\n", ctx->chunk_size));
LOG(LOG_BRIEF, ("chunk_max %d\n", ctx->chunk_max));
LOG(LOG_BRIEF, ("chunk %d\n", ctx->chunk));
exit(-1);
}
m = malloc(ctx->chunk_max);
LOG(LOG_DEBUG, ("allocating new chunk %p\n", m));
if (m == NULL)
{
LOG(LOG_ERROR, ("out of memory error in file %s, line %d\n",
__FILE__, __LINE__));
exit(-1);
}
ctx->chunk += 1;
ctx->chunks[ctx->chunk] = m;
ctx->chunk_pos = 0;
}
p = (char*)ctx->chunks[ctx->chunk] + ctx->chunk_pos;
ctx->chunk_pos += ctx->chunk_size;
return p;
}
void *
chunkpool_calloc(struct chunkpool *ctx)
{
void *p = chunkpool_malloc(ctx);
memset(p, 0, ctx->chunk_size);
return p;
}