wsalloc.c
上传用户:gzpyjq
上传日期:2013-01-31
资源大小:1852k
文件大小:5k
源码类别:

手机WAP编程

开发平台:

WINDOWS

  1. /*
  2.  *
  3.  * wsalloc.c
  4.  *
  5.  * Author: Markku Rossi <mtr@iki.fi>
  6.  *
  7.  * Copyright (c) 1999-2000 WAPIT OY LTD.
  8.  *  All rights reserved.
  9.  *
  10.  * Memory allocation routines.  These are simple stub functions to fix
  11.  * some brain damages, found from some system's default allocators.
  12.  *
  13.  */
  14. #include "wsint.h"
  15. #if !WS_MEM_DEBUG
  16. /********************* Global functions *********************************/
  17. void *ws_malloc(size_t size)
  18. {
  19.     return malloc(size);
  20. }
  21. void *ws_calloc(size_t num, size_t size)
  22. {
  23.     return calloc(num, size);
  24. }
  25. void *ws_realloc(void *ptr, size_t size)
  26. {
  27.     if (size == 0) {
  28.         if (ptr)
  29.             free(ptr);
  30.         return NULL;
  31.     }
  32.     if (ptr == NULL)
  33.         return malloc(size);
  34.     return realloc(ptr, size);
  35. }
  36. void *ws_memdup(const void *ptr, size_t size)
  37. {
  38.     unsigned char *data = ws_malloc(size + 1);
  39.     if (data == NULL)
  40.         return NULL;
  41.     memcpy(data, ptr, size);
  42.     data[size] = '';
  43.     return data;
  44. }
  45. void *ws_strdup(const char *str)
  46. {
  47.     size_t len;
  48.     void *s;
  49.     if (str == NULL)
  50.         return NULL;
  51.     len = strlen(str);
  52.     s = ws_malloc(len + 1);
  53.     if (s == NULL)
  54.         return NULL;
  55.     memcpy(s, str, len + 1);
  56.     return s;
  57. }
  58. void ws_free(void *ptr)
  59. {
  60.     if (ptr)
  61.         free(ptr);
  62. }
  63. #else /* WS_MEM_DEBUG */
  64. /********************* Memory debugging routines ************************/
  65. #define SIZE(_size) (sizeof(WsMemBlockHdr) + (_size))
  66. #define MAGIC 0xfe01fa77
  67. struct WsMemBlockHdrRec
  68. {
  69.     unsigned long magic;
  70.     struct WsMemBlockHdrRec *next;
  71.     struct WsMemBlockHdrRec *prev;
  72.     size_t size;
  73.     const char *file;
  74.     int line;
  75. };
  76. typedef struct WsMemBlockHdrRec WsMemBlockHdr;
  77. /* A linked list of currently allocated blocks. */
  78. WsMemBlockHdr *blocks = NULL;
  79. /* How many blocks are currently allocated. */
  80. unsigned int num_blocks = 0;
  81. /* The maximum amount of blocks used. */
  82. unsigned int max_num_blocks = 0;
  83. /* How many (user) bytes of memory the currently allocated blocks
  84. use. */
  85. size_t balance = 0;
  86. /* The maximum amount of memory used. */
  87. size_t max_balance = 0;
  88. /* The alloc sequence number. */
  89. unsigned int alloc_number = 0;
  90. /* How many allocations are successful. */
  91. unsigned int num_successful_allocs = -1;
  92. static void add_block(WsMemBlockHdr *b, size_t size, const char *file, int line)
  93. {
  94.     b->magic = MAGIC;
  95.     b->next = blocks;
  96.     b->prev = NULL;
  97.     if (blocks)
  98.         blocks->prev = b;
  99.     blocks = b;
  100.     b->size = size;
  101.     b->file = file;
  102.     b->line = line;
  103.     num_blocks++;
  104.     balance += size;
  105.     if (balance > max_balance)
  106.         max_balance = balance;
  107.     if (num_blocks > max_num_blocks)
  108.         max_num_blocks = num_blocks;
  109. }
  110. static void remove_block(WsMemBlockHdr *b)
  111. {
  112.     if (b->magic != MAGIC)
  113.         ws_fatal("remove_block(): invalid magicn");
  114.     if (b->next)
  115.         b->next->prev = b->prev;
  116.     if (b->prev)
  117.         b->prev->next = b->next;
  118.     else
  119.         blocks = b->next;
  120.     balance -= b->size;
  121.     num_blocks--;
  122.     memset(b, 0xfe, SIZE(b->size));
  123. }
  124. void *ws_malloc_i(size_t size, const char *file, int line)
  125. {
  126.     WsMemBlockHdr *b;
  127.     if (alloc_number++ >= num_successful_allocs)
  128.         return NULL;
  129.     b = malloc(SIZE(size));
  130.     if (b == NULL)
  131.         return NULL;
  132.     add_block(b, size, file, line);
  133.     return b + 1;
  134. }
  135. void *ws_calloc_i(size_t num, size_t size, const char *file, int line)
  136. {
  137.     void *p = ws_malloc_i(num * size, file, line);
  138.     if (p)
  139.         memset(p, 0, num * size);
  140.     return p;
  141. }
  142. void *ws_realloc_i(void *ptr, size_t size, const char *file, int line)
  143. {
  144.     WsMemBlockHdr *b = ((WsMemBlockHdr *) ptr) - 1;
  145.     void *n;
  146.     if (ptr == NULL)
  147.         return ws_malloc_i(size, file, line);
  148.     if (b->size >= size)
  149.         /* We can use the old block. */
  150.         return ptr;
  151.     /* Allocate a bigger block. */
  152.     n = ws_malloc_i(size, file, line);
  153.     if (n == NULL)
  154.         return NULL;
  155.     memcpy(n, ptr, b->size);
  156.     /* Free old block. */
  157.     remove_block(b);
  158.     free(b);
  159.     return n;
  160. }
  161. void *ws_memdup_i(const void *ptr, size_t size, const char *file, int line)
  162. {
  163.     void *p = ws_malloc_i(size + 1, file, line);
  164.     if (p) {
  165.         unsigned char *cp = (unsigned char *) p;
  166.         memcpy(p, ptr, size);
  167.         cp[size] = '';
  168.     }
  169.     return p;
  170. }
  171. void *ws_strdup_i(const char *str, const char *file, int line)
  172. {
  173.     return ws_memdup_i(str, strlen(str), file, line);
  174. }
  175. void ws_free_i(void *ptr)
  176. {
  177.     WsMemBlockHdr *b = ((WsMemBlockHdr *) ptr) - 1;
  178.     if (ptr == NULL)
  179.         return;
  180.     remove_block(b);
  181.     free(b);
  182. }
  183. int ws_has_leaks(void)
  184. {
  185.     return num_blocks || balance;
  186. }
  187. void ws_dump_blocks(void)
  188. {
  189.     WsMemBlockHdr *b;
  190.     fprintf(stderr, "ws: maximum memory usage: %u blocks, %ld bytesn",
  191.             max_num_blocks, (long) max_balance);
  192.     fprintf(stderr, "ws: number of allocs: %un", alloc_number);
  193.     if (num_blocks || balance) {
  194.         fprintf(stderr, "ws: memory leaks: %u blocks, %ld bytes:n",
  195.                 num_blocks, (long) balance);
  196.         for (b = blocks; b; b = b->next)
  197.             fprintf(stderr, "%s:%d: %ldn", b->file, b->line, (long) b->size);
  198.     }
  199. }
  200. void ws_clear_leaks(unsigned int num_successful_allocs_)
  201. {
  202.     alloc_number = 0;
  203.     num_successful_allocs = num_successful_allocs_;
  204.     blocks = NULL;
  205. }
  206. #endif /* WS_MEM_DEBUG */