home *** CD-ROM | disk | FTP | other *** search
/ rtsi.com / 2014.01.www.rtsi.com.tar / www.rtsi.com / OS9 / OSK / NETWORK / ISP / bind.4.8.3.lzh / BIND483 / NAMED / storage.c < prev    next >
Text File  |  1993-08-24  |  3KB  |  167 lines

  1. /*
  2.  *            S T O R A G E . C
  3.  *
  4.  * Ray Tracing program, storage manager.
  5.  *
  6.  *  Functions -
  7.  *    rt_malloc    Allocate storage, with visibility & checking
  8.  *    rt_free        Similarly, free storage
  9.  *    rt_prmem    When debugging, print memory map
  10.  *    calloc, cfree    Which call rt_malloc, rt_free
  11.  *
  12.  *  Author -
  13.  *    Michael John Muuss
  14.  *  
  15.  *  Source -
  16.  *    SECAD/VLD Computing Consortium, Bldg 394
  17.  *    The U. S. Army Ballistic Research Laboratory
  18.  *    Aberdeen Proving Ground, Maryland  21005-5066
  19.  *  
  20.  *  Copyright Notice -
  21.  *    This software is Copyright (C) 1987 by the United States Army.
  22.  *    All rights reserved.
  23.  */
  24. #ifndef lint
  25. static char RCSstorage[] = "@(#)$Header: storage.c,v 1.1 87/06/06 07:58:06 dpk BRL $";
  26. #endif
  27.  
  28. #include <sys/param.h>
  29. #if BSD >= 43
  30. #include <sys/syslog.h>
  31. #else
  32. #include <stdio.h>
  33. #define    LOG_ERR    0
  34. #endif BSD
  35.  
  36. #undef malloc
  37. #undef free
  38.  
  39. #define MDB_SIZE    20000
  40. #define MDB_MAGIC    0x12348969
  41. struct memdebug {
  42.     char    *mdb_addr;
  43.     char    *mdb_str;
  44.     int    mdb_len;
  45. } rt_mdb[MDB_SIZE];
  46.  
  47. /*
  48.  *            R T _ M A L L O C
  49.  */
  50. char *
  51. rt_malloc(cnt)
  52. unsigned int cnt;
  53. {
  54.     register char *ptr;
  55.     extern char *malloc();
  56.  
  57.     cnt = (cnt+2*sizeof(int)-1)&(~(sizeof(int)-1));
  58.     ptr = malloc(cnt);
  59.  
  60.     if( ptr==(char *)0 ) {
  61.         syslog(LOG_ERR, "rt_malloc: malloc failure");
  62.         abort();
  63.     } else     {
  64.         register struct memdebug *mp = rt_mdb;
  65.         for( ; mp < &rt_mdb[MDB_SIZE]; mp++ )  {
  66.             if( mp->mdb_len > 0 )  continue;
  67.             mp->mdb_addr = ptr;
  68.             mp->mdb_len = cnt;
  69.             mp->mdb_str = "???";
  70.             goto ok;
  71.         }
  72.         syslog(LOG_ERR, "rt_malloc:  memdebug overflow\n");
  73.     }
  74. ok:    ;
  75.     {
  76.         register int *ip = (int *)(ptr+cnt-sizeof(int));
  77.         *ip = MDB_MAGIC;
  78.     }
  79.     return(ptr);
  80. }
  81.  
  82. /*
  83.  *            R T _ F R E E
  84.  */
  85. void
  86. rt_free(ptr)
  87. char *ptr;
  88. {
  89.     register struct memdebug *mp = rt_mdb;
  90.     for( ; mp < &rt_mdb[MDB_SIZE]; mp++ )  {
  91.             if( mp->mdb_len <= 0 )  continue;
  92.         if( mp->mdb_addr != ptr )  continue;
  93.         {
  94.             register int *ip = (int *)(ptr+mp->mdb_len-sizeof(int));
  95.             if( *ip != MDB_MAGIC )  {
  96.                 syslog(LOG_ERR, "ERROR rt_free(x%x, %s) corrupted! x%x!=x%x\n", ptr, "???", *ip, MDB_MAGIC);
  97.                 abort();
  98.             }
  99.         }
  100.         mp->mdb_len = 0;    /* successful free */
  101.         goto ok;
  102.     }
  103.     syslog(LOG_ERR, "ERROR rt_free(x%x, %s) bad pointer!\n", ptr, "???");
  104.     abort();
  105. ok:    ;
  106.  
  107.     *((int *)ptr) = -1;    /* zappo! */
  108.     free(ptr);
  109. }
  110.  
  111. /*
  112.  *            R T _ P R M E M
  113.  * 
  114.  *  Print map of memory currently in use.
  115.  */
  116. void
  117. rt_prmem(str)
  118. char *str;
  119. {
  120.     register struct memdebug *mp = rt_mdb;
  121.     register int *ip;
  122.  
  123.     printf("\nRT memory use\t\t%s\n", str);
  124.     for( ; mp < &rt_mdb[MDB_SIZE]; mp++ )  {
  125.         if( mp->mdb_len <= 0 )  continue;
  126.         ip = (int *)(mp->mdb_addr+mp->mdb_len-sizeof(int));
  127.         printf("%7x %5x %s %s\n",
  128.             mp->mdb_addr, mp->mdb_len, mp->mdb_str,
  129.             *ip!=MDB_MAGIC ? "-BAD-" : "" );
  130.         if( *ip != MDB_MAGIC )
  131.             printf("\t%x\t%x\n", *ip, MDB_MAGIC);
  132.     }
  133. }
  134.  
  135. char *
  136. calloc(num, size)
  137.     register unsigned num, size;
  138. {
  139.     extern char *malloc();
  140.     register char *p;
  141.  
  142.     size *= num;
  143.     if (p = rt_malloc(size))
  144.         bzero(p, size);
  145.     return (p);
  146. }
  147.  
  148. cfree(p, num, size)
  149.     char *p;
  150.     unsigned num;
  151.     unsigned size;
  152. {
  153.     rt_free(p);
  154. }
  155.  
  156. #if BSD < 43
  157. openlog() {}
  158.  
  159. syslog(x, str, a, b, c, d, e, f)
  160. int    x;
  161. char    *str;
  162. int    a, b, c, d, e, f;
  163. {
  164.     fprintf(stderr, str, a, b, c, d, e, f);
  165. }
  166. #endif BSD
  167.