alloc.c
上传用户:rrhhcc
上传日期:2015-12-11
资源大小:54129k
文件大小:5k
源码类别:

通讯编程

开发平台:

Visual C++

  1. /* $Header: /usr/src/mash/repository/vint/xgraph/alloc.c,v 1.1.1.1 1999/12/03 23:15:53 heideman Exp $ */
  2. /*
  3.  *
  4.  * alloc.c : Memory checked Malloc. This malloc keeps track of memory usage.
  5.  *
  6.  * Routines:
  7.  * char *  Malloc();
  8.  * char * Calloc();
  9.  * char * Realloc();
  10.  * void  Free();
  11.  * unsigned MemStat();
  12.  * unsigned MemPtr();
  13.  * void MemChain();
  14.  *
  15.  * $Log: alloc.c,v $
  16.  * Revision 1.1.1.1  1999/12/03 23:15:53  heideman
  17.  * xgraph-12.0
  18.  *
  19.  * Revision 1.10  1991/02/01  08:12:55  christos
  20.  * Overhaul... Simplified and added calloc.
  21.  *
  22.  * Revision 1.9  1990/10/02  18:11:24  christos
  23.  * Another Realloc() bug!
  24.  *
  25.  * Revision 1.8  90/10/02  17:32:45  christos
  26.  * Fixed Realloc() bug.
  27.  *
  28.  * Revision 1.7  90/08/24  02:28:15  christos
  29.  * Changed bigstruct_t to align_t
  30.  * for lint.
  31.  *
  32.  * Revision 1.6  90/07/15  17:31:33  christos
  33.  * Fixed MemPtr Bug
  34.  *
  35.  * Revision 1.5  90/07/11  16:19:31  christos
  36.  * Added Realloc()
  37.  *
  38.  * Revision 1.4  90/03/21  12:58:44  christos
  39.  * Fixed void buggy computations.
  40.  *
  41.  * Revision 1.3  90/02/26  02:15:11  christos
  42.  * ANSI conformance.
  43.  *
  44.  * Revision 1.2  89/08/29  14:08:25  christos
  45.  * Fixed.
  46.  *
  47.  * Revision 1.1  89/03/27  14:23:40  christos
  48.  * Initial revision
  49.  *
  50.  */
  51. #ifndef lint
  52. static char rcsid[] = "$Id: alloc.c,v 1.1.1.1 1999/12/03 23:15:53 heideman Exp $";
  53. #endif /* lint */
  54. #include <stdio.h>
  55. #ifdef __STDC__
  56. #include <stdlib.h>
  57. #include <memory.h>
  58. #else
  59. extern char *malloc();
  60. extern char *calloc();
  61. extern char *realloc();
  62. extern void free();
  63. extern void abort();
  64. extern char *memset();
  65. #endif
  66. #ifndef NIL
  67. #define NIL(a) ((a *) 0)
  68. #endif /* NIL */
  69. #ifndef MIN
  70. #define MIN(a, b)  ((a) > (b) ? (b) : (a))
  71. #endif /* MIN */
  72. #ifndef MAX
  73. #define MAX(a, b)  ((a) < (b) ? (b) : (a))
  74. #endif /* MAX */
  75. #ifndef private
  76. #define private static
  77. #endif /* private */
  78. #ifndef public
  79. #define public
  80. #endif /* public */
  81. #define SIG_GOOD 0x01020304
  82. #define SIG_FREE 0x04030201
  83. #define OVERHEAD (sizeof(long) + sizeof(unsigned))
  84. private unsigned memused = 0;
  85. private unsigned memalloc = 0;
  86. #ifdef __STDC__
  87. typedef void *Ptr;
  88. #else
  89. typedef char *Ptr;
  90. #endif
  91. /* _chaina():
  92.  * Check things for validity and allocate space
  93.  */
  94. private Ptr
  95. _chaina(n, routine, action, tptr)
  96. unsigned n;
  97. Ptr(*routine) ();
  98. char   *action;
  99. Ptr     tptr;
  100. {
  101.     char   *ptr;
  102.     if (n == 0) {
  103. (void) fprintf(stderr, "*** %s zero length block.n",
  104.        action);
  105. if (tptr != (Ptr) 0) {
  106.     ptr = tptr;
  107.     *((long *) ptr) = SIG_GOOD;
  108.     memused += *((unsigned *) &ptr[sizeof(long)]);
  109.     memalloc++;
  110. }
  111. abort();
  112.     }
  113.     ptr = (tptr == (Ptr) 0) ? (char *) (*routine) (n + OVERHEAD) :
  114. (char *) (*routine) (tptr, n + OVERHEAD);
  115.     if (ptr == NIL(char)) {
  116. if (tptr != (Ptr) 0)
  117.     *((long *) tptr) = SIG_GOOD;
  118. (void) fprintf(stderr,
  119.        "*** Out of memory in %s (current allocation %d).n",
  120.        action, memused, n);
  121. abort();
  122.     }
  123.     *((long *) ptr) = SIG_GOOD;
  124.     memused += (*((unsigned *) &ptr[sizeof(long)]) = n);
  125.     memalloc++;
  126.     ptr += OVERHEAD;
  127.     return ((Ptr) ptr);
  128. } /* end _chaina */
  129. /* _chainc():
  130.  * Check the pointer given
  131.  */
  132. private unsigned
  133. _chainc(ptr, action)
  134. char  **ptr;
  135. char   *action;
  136. {
  137.     static char *msg = "*** %s %s pointer.n";
  138.     if (*ptr == NIL(char)) {
  139. (void) fprintf(stderr, msg, action, "nil");
  140. abort();
  141.     }
  142.     *ptr -= OVERHEAD;
  143.     switch (*((long *) *ptr)) {
  144.     case SIG_GOOD:
  145. return (*((unsigned *) &((*ptr)[sizeof(long)])));
  146.     case SIG_FREE:
  147. (void) fprintf(stderr, msg, action, "free");
  148. abort();
  149.     default:
  150. (void) fprintf(stderr, msg, action, "invalid");
  151. abort();
  152.     }
  153.     return (0);
  154. } /* end _chainc */
  155. /* Malloc():
  156.  * real alloc
  157.  */
  158. public  Ptr
  159. Malloc(n)
  160. unsigned n;
  161. {
  162.     static char *routine = "malloc";
  163.     return (_chaina(n, malloc, routine, (Ptr) 0));
  164. } /* end Malloc */
  165. /* Calloc():
  166.  * real alloc
  167.  */
  168. public  Ptr
  169. Calloc(n, sz)
  170. unsigned n,
  171.         sz;
  172. {
  173.     Ptr     ptr;
  174.     static char *routine = "calloc";
  175.     n *= sz;
  176.     ptr = _chaina(n, malloc, routine, (Ptr) 0);
  177.     memset((char *) ptr, 0, n);
  178.     return (ptr);
  179. } /* end Calloc */
  180. /* Realloc():
  181.  * real alloc
  182.  */
  183. public  Ptr
  184. Realloc(ptr, n)
  185. Ptr     ptr;
  186. unsigned n;
  187. {
  188.     static char *routine = "realloc";
  189.     memused -= _chainc((char **) &ptr, routine);
  190.     memalloc--;
  191.     *((long *) ptr) = SIG_FREE;
  192.     return (_chaina(n, realloc, routine, ptr));
  193. } /* end Realloc */
  194. /* Free():
  195.  * free memory counting the number of bytes freed
  196.  */
  197. public void
  198. Free(ptr)
  199. Ptr     ptr;
  200. {
  201.     static char *routine = "free";
  202.     memused -= _chainc((char **) &ptr, routine);
  203.     memalloc--;
  204.     *((long *) ptr) = SIG_FREE;
  205.     free(ptr);
  206. } /* end Free */
  207. /* MemChain():
  208.  * Dump the chain
  209.  */
  210. public void
  211. MemChain()
  212. {
  213.     if (memused == 0 && memalloc == 0)
  214. (void) fprintf(stdout, "tNo memory allocated.n");
  215.     else {
  216. (void) fprintf(stdout, "t%u Bytes allocated in %u chunks.n", memused,
  217.        memalloc);
  218. (void) fprintf(stdout, "tAverage chunk length %u bytes.n",
  219.        memused / memalloc);
  220.     }
  221. } /* end MemChain */
  222. /* MemStat():
  223.  * return the amount of memory in use
  224.  */
  225. public unsigned
  226. MemStat()
  227. {
  228.     return (memused);
  229. } /* end MemStat */
  230. /* MemPtr():
  231.  * return the amount of memory used by the pointer
  232.  */
  233. public unsigned
  234. MemPtr(ptr)
  235. Ptr     ptr;
  236. {
  237.     static char *routine = "get size";
  238.     return (_chainc((char **) &ptr, routine));
  239. } /* end MemPtr */