91 lines
2.9 KiB
C
91 lines
2.9 KiB
C
|
/*
|
||
|
* This file is a part of Pcompress, a chunked parallel multi-
|
||
|
* algorithm lossless compression and decompression program.
|
||
|
*
|
||
|
* Copyright (C) 2012-2013 Moinak Ghosh. All rights reserved.
|
||
|
* Use is subject to license terms.
|
||
|
*
|
||
|
* This program 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.
|
||
|
*
|
||
|
* This program 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 this program.
|
||
|
* If not, see <http://www.gnu.org/licenses/>.
|
||
|
*
|
||
|
* moinakg@belenix.org, http://moinakg.wordpress.com/
|
||
|
*
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
--------------------------------------------------------------------
|
||
|
By Bob Jenkins, September 1996. recycle.h
|
||
|
You may use this code in any way you wish, and it is free. No warranty.
|
||
|
|
||
|
This manages memory for commonly-allocated structures.
|
||
|
It allocates RESTART to REMAX items at a time.
|
||
|
Timings have shown that, if malloc is used for every new structure,
|
||
|
malloc will consume about 90% of the time in a program. This
|
||
|
module cuts down the number of mallocs by an order of magnitude.
|
||
|
This also decreases memory fragmentation, and freeing all structures
|
||
|
only requires freeing the root.
|
||
|
--------------------------------------------------------------------
|
||
|
*/
|
||
|
|
||
|
#ifndef STANDARD
|
||
|
#include "standard.h"
|
||
|
#endif
|
||
|
|
||
|
#ifndef RECYCLE
|
||
|
#define RECYCLE
|
||
|
|
||
|
#define RESTART 0
|
||
|
#define REMAX 32000
|
||
|
|
||
|
struct recycle
|
||
|
{
|
||
|
struct recycle *next;
|
||
|
};
|
||
|
typedef struct recycle recycle;
|
||
|
|
||
|
struct reroot
|
||
|
{
|
||
|
struct recycle *list; /* list of malloced blocks */
|
||
|
struct recycle *trash; /* list of deleted items */
|
||
|
size_t size; /* size of an item */
|
||
|
size_t logsize; /* log_2 of number of items in a block */
|
||
|
word numleft; /* number of bytes left in this block */
|
||
|
};
|
||
|
typedef struct reroot reroot;
|
||
|
|
||
|
/* make a new recycling root */
|
||
|
reroot *remkroot(/*_ size_t mysize _*/);
|
||
|
|
||
|
/* free a recycling root and all the items it has made */
|
||
|
void refree(/*_ struct reroot *r _*/);
|
||
|
|
||
|
/* get a new (cleared) item from the root */
|
||
|
#define renew(r) ((r)->numleft ? \
|
||
|
(((char *)((r)->list+1))+((r)->numleft-=(r)->size)) : renewx(r))
|
||
|
|
||
|
char *renewx(/*_ struct reroot *r _*/);
|
||
|
|
||
|
/* delete an item; let the root recycle it */
|
||
|
/* void redel(/o_ struct reroot *r, struct recycle *item _o/); */
|
||
|
#define redel(root,item) { \
|
||
|
((recycle *)item)->next=(root)->trash; \
|
||
|
(root)->trash=(recycle *)(item); \
|
||
|
}
|
||
|
|
||
|
/* malloc, but complain to stderr and exit program if no joy */
|
||
|
/* use plain free() to free memory allocated by remalloc() */
|
||
|
char *remalloc(/*_ size_t len, char *purpose _*/);
|
||
|
|
||
|
#endif /* RECYCLE */
|