|
|
1.1 ! root 1: /* $Header: malloc.c,v 2.2 88/09/19 12:55:18 nhall Exp $ */ ! 2: /* $Source: /var/home/tadl/src/argo/xebec/RCS/malloc.c,v $ */ ! 3: /* ! 4: * This code is such a kludge that I don't want to put my name on it. ! 5: * It was a ridiculously fast hack and needs rewriting. ! 6: * However it does work... ! 7: */ ! 8: ! 9: /* ! 10: * a simple malloc ! 11: * it might be brain-damaged but for the purposes of xebec ! 12: * it's a whole lot faster than the c library malloc ! 13: */ ! 14: ! 15: #include <stdio.h> ! 16: #include "malloc.h" ! 17: #include "debug.h" ! 18: #define CHUNKSIZE 4096*2 ! 19: ! 20: static char *hiwat, *highend; ! 21: int bytesmalloced=0; ! 22: int byteswasted = 0; ! 23: ! 24: ! 25: init_alloc() ! 26: { ! 27: #ifdef LINT ! 28: hiwat = 0; ! 29: highend = 0; ! 30: #else LINT ! 31: extern char *sbrk(); ! 32: ! 33: hiwat = (char *) sbrk(0); ! 34: hiwat = (char *)((unsigned)(hiwat + 3) & ~0x3); ! 35: highend = hiwat; ! 36: #endif LINT ! 37: } ! 38: ! 39: HIWAT(s) ! 40: char *s; ! 41: { ! 42: IFDEBUG(M) ! 43: fprintf(stdout, "HIWAT 0x%x %s\n", hiwat,s); ! 44: fflush(stdout); ! 45: ENDDEBUG ! 46: } ! 47: ! 48: #define MIN(x,y) ((x<y)?x:y) ! 49: ! 50: char *Malloc(x) ! 51: int x; ! 52: { ! 53: char *c; ! 54: extern char *sbrk(); ! 55: static int firsttime=1; ! 56: int total = x; ! 57: int first_iter = 1; ! 58: char *returnvalue; ! 59: ! 60: IFDEBUG(N) ! 61: fprintf(stdout, "Malloc 0x%x, %d, bytesmalloced %d\n", ! 62: total,total, bytesmalloced); ! 63: fflush(stdout); ! 64: ENDDEBUG ! 65: IFDEBUG(M) ! 66: fprintf(stdout, "Malloc 0x%x, %d, hiwat 0x%x\n", ! 67: total,total, hiwat); ! 68: fflush(stdout); ! 69: ENDDEBUG ! 70: if(firsttime) { ! 71: hiwat = sbrk(0); ! 72: if(((unsigned)(hiwat) & 0x3)) { ! 73: bytesmalloced = 4 - (int) ((unsigned)(hiwat) & 0x3); ! 74: hiwat = sbrk( bytesmalloced ); ! 75: } else ! 76: bytesmalloced = 0; ! 77: firsttime = 0; ! 78: highend = hiwat; ! 79: } ! 80: while( total ) { ! 81: x = MIN(CHUNKSIZE, total); ! 82: if(total != x) { ! 83: IFDEBUG(N) ! 84: fprintf(stdout, "BIG Malloc tot %d, x %d, left %d net %d\n", ! 85: total,x, total-x, bytesmalloced); ! 86: fflush(stdout); ! 87: ENDDEBUG ! 88: } ! 89: if ( (hiwat + x) > highend) { ! 90: c = sbrk(CHUNKSIZE); ! 91: IFDEBUG(M) ! 92: fprintf(stdout, "hiwat 0x%x, x 0x%x, highend 0x%x, c 0x%x\n", ! 93: hiwat, x, highend, c); ! 94: fflush(stdout); ! 95: ENDDEBUG ! 96: if( c == (char *) -1 ) { ! 97: fprintf(stderr, "Ran out of memory!\n"); ! 98: Exit(-1); ! 99: } ! 100: if(first_iter) { ! 101: returnvalue = c; ! 102: first_iter = 0; ! 103: } ! 104: bytesmalloced += CHUNKSIZE; ! 105: IFDEBUG(m) ! 106: if (highend != c) { ! 107: fprintf(OUT, "warning: %d wasted bytes!\n", highend - hiwat); ! 108: fprintf(OUT, " chunksize 0x%x, x 0x%x \n", CHUNKSIZE, x); ! 109: } ! 110: ENDDEBUG ! 111: highend = c + CHUNKSIZE; ! 112: hiwat = c; ! 113: } ! 114: c = hiwat; ! 115: if(first_iter) { ! 116: returnvalue = c; ! 117: first_iter = 0; ! 118: } ! 119: hiwat += x; ! 120: total -= x; ! 121: } ! 122: if((unsigned)hiwat & 0x3) { ! 123: byteswasted += (int)((unsigned)(hiwat) & 0x3); ! 124: hiwat = (char *)((unsigned)(hiwat + 3) & ~0x3); ! 125: } ! 126: IFDEBUG(M) ! 127: fprintf(stdout, "Malloc = 0x%x, bytesm 0x%x, wasted 0x%x, hiwat 0x%x\n", ! 128: returnvalue, bytesmalloced, byteswasted, hiwat); ! 129: ENDDEBUG ! 130: IFDEBUG(N) ! 131: fprintf(stdout, "Malloc returns 0x%x, sbrk(0) 0x%x\n", returnvalue, sbrk(0)); ! 132: fflush(stdout); ! 133: ENDDEBUG ! 134: return(returnvalue); ! 135: } ! 136:
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.