summaryrefslogtreecommitdiffstats
path: root/sys/netiso/xebec/malloc.c
diff options
context:
space:
mode:
Diffstat (limited to 'sys/netiso/xebec/malloc.c')
-rw-r--r--sys/netiso/xebec/malloc.c136
1 files changed, 136 insertions, 0 deletions
diff --git a/sys/netiso/xebec/malloc.c b/sys/netiso/xebec/malloc.c
new file mode 100644
index 0000000..5cdfc14
--- /dev/null
+++ b/sys/netiso/xebec/malloc.c
@@ -0,0 +1,136 @@
+/* $Header: malloc.c,v 2.2 88/09/19 12:55:18 nhall Exp $ */
+/* $Source: /var/home/tadl/src/argo/xebec/RCS/malloc.c,v $ */
+/*
+ * This code is such a kludge that I don't want to put my name on it.
+ * It was a ridiculously fast hack and needs rewriting.
+ * However it does work...
+ */
+
+/*
+ * a simple malloc
+ * it might be brain-damaged but for the purposes of xebec
+ * it's a whole lot faster than the c library malloc
+ */
+
+#include <stdio.h>
+#include "malloc.h"
+#include "debug.h"
+#define CHUNKSIZE 4096*2
+
+static char *hiwat, *highend;
+int bytesmalloced=0;
+int byteswasted = 0;
+
+
+init_alloc()
+{
+#ifdef LINT
+ hiwat = 0;
+ highend = 0;
+#else LINT
+ extern char *sbrk();
+
+ hiwat = (char *) sbrk(0);
+ hiwat = (char *)((unsigned)(hiwat + 3) & ~0x3);
+ highend = hiwat;
+#endif LINT
+}
+
+HIWAT(s)
+char *s;
+{
+ IFDEBUG(M)
+ fprintf(stdout, "HIWAT 0x%x %s\n", hiwat,s);
+ fflush(stdout);
+ ENDDEBUG
+}
+
+#define MIN(x,y) ((x<y)?x:y)
+
+char *Malloc(x)
+int x;
+{
+ char *c;
+ extern char *sbrk();
+ static int firsttime=1;
+ int total = x;
+ int first_iter = 1;
+ char *returnvalue;
+
+ IFDEBUG(N)
+ fprintf(stdout, "Malloc 0x%x, %d, bytesmalloced %d\n",
+ total,total, bytesmalloced);
+ fflush(stdout);
+ ENDDEBUG
+ IFDEBUG(M)
+ fprintf(stdout, "Malloc 0x%x, %d, hiwat 0x%x\n",
+ total,total, hiwat);
+ fflush(stdout);
+ ENDDEBUG
+ if(firsttime) {
+ hiwat = sbrk(0);
+ if(((unsigned)(hiwat) & 0x3)) {
+ bytesmalloced = 4 - (int) ((unsigned)(hiwat) & 0x3);
+ hiwat = sbrk( bytesmalloced );
+ } else
+ bytesmalloced = 0;
+ firsttime = 0;
+ highend = hiwat;
+ }
+ while( total ) {
+ x = MIN(CHUNKSIZE, total);
+ if(total != x) {
+ IFDEBUG(N)
+ fprintf(stdout, "BIG Malloc tot %d, x %d, left %d net %d\n",
+ total,x, total-x, bytesmalloced);
+ fflush(stdout);
+ ENDDEBUG
+ }
+ if ( (hiwat + x) > highend) {
+ c = sbrk(CHUNKSIZE);
+ IFDEBUG(M)
+ fprintf(stdout, "hiwat 0x%x, x 0x%x, highend 0x%x, c 0x%x\n",
+ hiwat, x, highend, c);
+ fflush(stdout);
+ ENDDEBUG
+ if( c == (char *) -1 ) {
+ fprintf(stderr, "Ran out of memory!\n");
+ Exit(-1);
+ }
+ if(first_iter) {
+ returnvalue = c;
+ first_iter = 0;
+ }
+ bytesmalloced += CHUNKSIZE;
+ IFDEBUG(m)
+ if (highend != c) {
+ fprintf(OUT, "warning: %d wasted bytes!\n", highend - hiwat);
+ fprintf(OUT, " chunksize 0x%x, x 0x%x \n", CHUNKSIZE, x);
+ }
+ ENDDEBUG
+ highend = c + CHUNKSIZE;
+ hiwat = c;
+ }
+ c = hiwat;
+ if(first_iter) {
+ returnvalue = c;
+ first_iter = 0;
+ }
+ hiwat += x;
+ total -= x;
+ }
+ if((unsigned)hiwat & 0x3) {
+ byteswasted += (int)((unsigned)(hiwat) & 0x3);
+ hiwat = (char *)((unsigned)(hiwat + 3) & ~0x3);
+ }
+ IFDEBUG(M)
+ fprintf(stdout, "Malloc = 0x%x, bytesm 0x%x, wasted 0x%x, hiwat 0x%x\n",
+ returnvalue, bytesmalloced, byteswasted, hiwat);
+ ENDDEBUG
+ IFDEBUG(N)
+ fprintf(stdout, "Malloc returns 0x%x, sbrk(0) 0x%x\n", returnvalue, sbrk(0));
+ fflush(stdout);
+ ENDDEBUG
+ return(returnvalue);
+}
+
OpenPOWER on IntegriCloud