membanger.c
上传用户:liugui
上传日期:2007-01-04
资源大小:822k
文件大小:6k
源码类别:

代理服务器

开发平台:

Unix_Linux

  1. #include <unistd.h>
  2. #include <stdlib.h>
  3. #include <stdio.h>
  4. #include <sys/types.h>
  5. #include <ctype.h>
  6. #include <sys/time.h>
  7. #include <strings.h>
  8. #include <sys/time.h>
  9. #include <sys/resource.h>
  10. #include "hash.h"
  11. static hash_table *mem_table = NULL;
  12. static hash_link *mem_entry;
  13. struct rusage myusage;
  14. #ifdef WITH_LIB
  15. #include "Mem.h"
  16. #include <assert.h>
  17. extern void sizeToPoolInit();
  18. extern MemPool *sizeToPool(size_t size);
  19. #endif
  20. extern char *malloc_options;
  21. void my_free(char *, int, void *);
  22. FILE *fp;
  23. char *fn;
  24. int initsiz;
  25. int maxsiz;
  26. int minchunk;
  27. HASHCMP ptrcmp;
  28. char mbuf[256];
  29. char abuf[32];
  30. char *p;
  31. int size;
  32. void *addr;
  33. int amt;
  34. int i;
  35. int a;
  36. int run_stats=0;
  37. void *my_xmalloc(size_t);
  38. void *my_xcalloc(int, size_t);
  39. int my_xfree(void *);
  40. #define xmalloc my_xmalloc
  41. #define xcalloc my_xcalloc
  42. #define xfree my_xfree
  43. int *size2id_array[2];
  44. int size2id_len=0;
  45. int size2id_alloc=0;
  46. typedef struct {
  47. char orig_ptr[32];
  48. void *my_ptr;
  49. #ifdef WITH_LIB
  50. MemPool *pool;
  51. #endif
  52. int size;
  53. } memitem;
  54. struct {
  55. int mallocs,frees,callocs,reallocs;
  56. } mstat;
  57. memitem *mi;
  58. void size2id(size_t, memitem *);
  59. void badformat();
  60. void init_stats(), print_stats();
  61. void my_hash_insert(hash_table *h, const char *k, memitem *item);
  62. static void *xmemAlloc(memitem *item);
  63. static void xmemFree(memitem *item);
  64. int 
  65. ptrcmp(const void *a,const void *b) 
  66. {
  67. return (strcmp(a,b));
  68. }
  69. main(int argc,char **argv)
  70. {
  71.     char c;
  72.     extern char *optarg; 
  73.     malloc_options = "A";
  74.     a=0;
  75.     while ((c = getopt(argc, argv, "f:i:M:l:m:r:N")) != -1) {
  76.       switch (c) {
  77. case 'N':
  78.    mem_pools_on=0;
  79.    break;
  80. case 'r':
  81.   run_stats=atoi(optarg);
  82.   break;
  83. case 'f':
  84.   fn=strdup(optarg);
  85.   fp=fopen(fn,"r");
  86.   break;
  87. case 'i':
  88.   initsiz=atoi(optarg);
  89.   break;
  90. case 'l':
  91.   mem_max_size = atoi(optarg)*1024*1024;
  92.   break;
  93. case 'M':
  94.   maxsiz=atoi(optarg);
  95.   break;
  96. case 'm':
  97.   minchunk=atoi(optarg);
  98.   break;
  99. default:
  100.      fprintf(stderr,
  101. "Usage: %s -f file -M maxsiz -i initsiz -m minchunk",argv[0]);
  102.   exit(1);
  103.       }
  104.     }
  105.     if (!fp) {
  106. fprintf(stderr,
  107. "%s pummels %sn%s . o O ( You't supply a valid tracefile.)n",
  108. argv[0], getenv("USER"), argv[0]);
  109. exit(1);
  110.     }
  111. #ifdef WITH_LIB
  112.     sizeToPoolInit();
  113. #endif
  114.     mem_table = hash_create(ptrcmp, 229, hash4);         /* small hash table */
  115.     init_stats();
  116.     while (fgets(mbuf, 256, fp)!=NULL) {
  117. if (run_stats>0 && (++a)%run_stats==0) print_stats();
  118. p=NULL;
  119. switch(mbuf[0]) {
  120. case 'm': /* malloc */
  121.    p=strtok(&mbuf[2],":");
  122.    if (!p) badformat();
  123.    size=atoi(p);
  124.    p=strtok(NULL,"n");
  125.    if (!p) badformat();
  126.    mi=malloc(sizeof(memitem)); 
  127.    strcpy(mi->orig_ptr,p);
  128.    mi->size=size;
  129.    size2id(size,mi);
  130.    mi->my_ptr = xmemAlloc(mi); /* (void *)xmalloc(size); */
  131.    assert(mi->my_ptr);
  132.    my_hash_insert(mem_table, mi->orig_ptr, mi);
  133.    mstat.mallocs++;
  134.    break;
  135. case 'c': /* calloc */
  136.    p=strtok(&mbuf[2],":");
  137.    if (!p) badformat();
  138.    amt=atoi(p);
  139.    p=strtok(NULL,":");
  140.    if (!p) badformat();
  141.    size=atoi(p);
  142.    p=strtok(NULL,"n");
  143.    if (!p) badformat();
  144.            mi=malloc(sizeof(memitem));
  145.    strcpy(mi->orig_ptr,p);
  146.    size2id(size,mi);
  147.            mi->size=amt*size;
  148.            mi->my_ptr= xmemAlloc(mi); /*(void *)xmalloc(amt*size);*/
  149.    assert(mi->my_ptr);
  150.    my_hash_insert(mem_table, mi->orig_ptr, mi);
  151.    mstat.callocs++;
  152.    break;
  153. case 'r':
  154.            p=strtok(&mbuf[2],":");
  155.    if (!p) badformat();
  156.    strcpy(abuf,p);
  157.            p=strtok(NULL,":");
  158.    if (!p) badformat();
  159.    mem_entry=hash_lookup(mem_table, p);
  160.            if (mem_entry==NULL) {
  161.                 fprintf(stderr,"invalid realloc (%s)!n",p);
  162. break;
  163.            }
  164.    mi=(memitem *)(mem_entry->item);
  165.    assert(mi->pool);
  166.    assert(mi->my_ptr);
  167.    xmemFree(mi); /* xfree(mi->my_ptr); */
  168.    size2id(atoi(p),mi);   /* we don't need it here I guess? */
  169.            strcpy(mi->orig_ptr,abuf);
  170.    p=strtok(NULL,"n");
  171.    if (!p) badformat();
  172.    mi->my_ptr= xmemAlloc(mi); /* (char *)xmalloc(atoi(p)); */
  173.    assert(mi->my_ptr);
  174.    mstat.reallocs++;
  175.    break;
  176. case 'f':
  177.    p=strtok(&mbuf[2],"n");
  178.    mem_entry=hash_lookup(mem_table, p);
  179.    if (mem_entry==NULL) {
  180. if (p[0]!='0')
  181. fprintf(stderr,"invalid free (%s) at line %d!n",p,a);
  182. break;
  183.    }
  184.    mi=(memitem *)(mem_entry->item);
  185.    assert(mi->pool);
  186.    assert(mi->my_ptr);
  187.    xmemFree(mi); /* xfree(mi->my_ptr); */ 
  188.    hash_unlink(mem_table, mem_entry, 1);
  189.    free(mi);
  190.    mstat.frees++;
  191.    break;
  192. default:
  193. fprintf(stderr,"%s pummels %s.bad.formatn", argv[0],fn);
  194. exit(1);
  195. }
  196.     }
  197.     fclose(fp);
  198.     print_stats();
  199. }
  200. void *
  201. my_xmalloc(size_t a)
  202. {
  203. return NULL;
  204. }
  205. void *
  206. my_xcalloc(int a, size_t b)
  207. {
  208. return NULL;
  209. }
  210. int
  211. my_xfree(void *p)
  212. {
  213. return 0;
  214. }
  215. void
  216. init_stats()
  217. {
  218. }
  219. void
  220. print_stats()
  221. {
  222. #ifdef WITH_LIB
  223.         memReport(stdout); 
  224. #endif
  225. getrusage(RUSAGE_SELF, &myusage);
  226. printf("m/c/f/r=%d/%d/%d/%dn",mstat.mallocs,mstat.callocs,
  227. mstat.frees, mstat.reallocs);
  228. #if 0
  229. printf("types                 : %dn",size2id_len);
  230. #endif
  231. printf("user time used        : %d.%dn", (int)myusage.ru_utime.tv_sec,
  232. (int)myusage.ru_utime.tv_usec);
  233. printf("system time used      : %d.%dn", (int)myusage.ru_stime.tv_sec,
  234.                                                 (int)myusage.ru_stime.tv_usec);
  235. printf("max resident set size : %dn",(int)myusage.ru_maxrss);
  236. printf("page faults           : %dn", (int)myusage.ru_majflt);
  237. }
  238. void
  239. size2id(size_t sz,memitem *mi)
  240. {
  241. #ifdef WITH_LIB
  242. mi->pool = sizeToPool(sz);
  243. assert(mi->pool);
  244. #endif
  245. return;
  246. }
  247. void
  248. badformat()
  249. {
  250.     fprintf(stderr,"pummel.bad.formatn");
  251.     exit(1);
  252. }
  253. /* unused code, saved for parts */
  254. const char *
  255. make_nam(int id, int size)
  256. {
  257.     const char *buf = malloc(30); /* argh */
  258.     sprintf((char *)buf, "pl:%d/%d", id, size);
  259.     return buf;
  260. }
  261. void
  262. my_hash_insert(hash_table *h, const char *k, memitem *item)
  263. {
  264. memitem *l;
  265. assert( item->pool);
  266. assert( item->my_ptr);
  267. hash_insert(h,k,item);
  268. }
  269. static void *
  270. xmemAlloc(memitem *item)
  271. {
  272.     extern MemPool *StringPool;
  273.     assert(item && item->pool);
  274.     if (StringPool == item->pool)
  275. return memStringAlloc(item->pool, item->size);
  276.     else
  277. return memAlloc(item->pool);
  278. }
  279. static void
  280. xmemFree(memitem *item)
  281. {
  282.     extern MemPool *StringPool;
  283.     assert(item && item->pool);
  284.     if (StringPool == item->pool)
  285.         return memStringFree(item->pool, item->my_ptr, item->size);
  286.     else
  287.         return memFree(item->pool, item->my_ptr);
  288. }
  289. void my_free(char *file, int line, void *ptr)
  290. {
  291. #if 0
  292. fprintf(stderr,"{%s:%d:%p",file,line,ptr);
  293. #endif
  294. free(ptr);
  295. #if 0 
  296. fprintf(stderr,"}n");
  297. #endif
  298. }