summaryrefslogtreecommitdiff
path: root/lib/recycle.c
diff options
context:
space:
mode:
authorpixel <pixel>2005-06-06 11:16:15 +0000
committerpixel <pixel>2005-06-06 11:16:15 +0000
commit863e6a84a38d3d02211f704a8430e86add6514ed (patch)
treebdf51e5fd58336eddcfd9b7bbc478fa6ab7181e2 /lib/recycle.c
parent2188dfc8e9c0406af3e7ab0152ea6eb837ad5c1c (diff)
Updated zlib, adding hashing functions, and introducing first bits of a new sliding window generic algorithm.
Diffstat (limited to 'lib/recycle.c')
-rw-r--r--lib/recycle.c86
1 files changed, 86 insertions, 0 deletions
diff --git a/lib/recycle.c b/lib/recycle.c
new file mode 100644
index 0000000..325e08a
--- /dev/null
+++ b/lib/recycle.c
@@ -0,0 +1,86 @@
+/*
+--------------------------------------------------------------------
+By Bob Jenkins, September 1996. recycle.c
+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 structures
+ only requires freeing the root.
+--------------------------------------------------------------------
+*/
+
+#include "generic.h"
+
+#ifndef RECYCLE
+# include "recycle.h"
+#endif
+
+reroot *remkroot(size)
+size_t size;
+{
+ reroot *r = (reroot *)remalloc(sizeof(reroot), "recycle.c, root");
+ r->list = (recycle *)0;
+ r->trash = (recycle *)0;
+ r->size = align(size);
+ r->logsize = RESTART;
+ r->numleft = 0;
+ return r;
+}
+
+void refree(r)
+struct reroot *r;
+{
+ recycle *temp;
+ if (temp = r->list) while (r->list)
+ {
+ temp = r->list->next;
+ free((char *)r->list);
+ r->list = temp;
+ }
+ free((char *)r);
+ return;
+}
+
+/* to be called from the macro renew only */
+char *renewx(r)
+struct reroot *r;
+{
+ recycle *temp;
+ if (r->trash)
+ { /* pull a node off the trash heap */
+ temp = r->trash;
+ r->trash = temp->next;
+ (void)memset((void *)temp, 0, r->size);
+ }
+ else
+ { /* allocate a new block of nodes */
+ r->numleft = r->size*((Uint32)1<<r->logsize);
+ if (r->numleft < REMAX) ++r->logsize;
+ temp = (recycle *)remalloc(sizeof(recycle) + r->numleft,
+ "recycle.c, data");
+ temp->next = r->list;
+ r->list = temp;
+ r->numleft-=r->size;
+ temp = (recycle *)((char *)(r->list+1)+r->numleft);
+ }
+ return (char *)temp;
+}
+
+char *remalloc(len, purpose)
+size_t len;
+char *purpose;
+{
+ char *x = (char *)malloc(len);
+ if (!x)
+ {
+// fprintf(stderr, "malloc of %d failed for %s\n",
+// len, purpose);
+// exit(SUCCESS);
+ }
+ return x;
+}
+