home *** CD-ROM | disk | FTP | other *** search
/ InfoMagic Source Code 1993 July / THE_SOURCE_CODE_CD_ROM.iso / bsd_srcs / sys / netiso / xebec / malloc.c < prev    next >
Encoding:
C/C++ Source or Header  |  1988-10-05  |  2.8 KB  |  137 lines

  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.  
  137.