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

代理服务器

开发平台:

Unix_Linux

  1. /*
  2.  * $Id: leakfinder.c,v 1.1 1998/12/11 21:01:12 wessels Exp $
  3.  *
  4.  * DEBUG: section 45    Callback Data Registry
  5.  * AUTHOR: Duane Wessels
  6.  *
  7.  * SQUID Internet Object Cache  http://squid.nlanr.net/Squid/
  8.  * ----------------------------------------------------------
  9.  *
  10.  *  Squid is the result of efforts by numerous individuals from the
  11.  *  Internet community.  Development is led by Duane Wessels of the
  12.  *  National Laboratory for Applied Network Research and funded by the
  13.  *  National Science Foundation.  Squid is Copyrighted (C) 1998 by
  14.  *  Duane Wessels and the University of California San Diego.  Please
  15.  *  see the COPYRIGHT file for full details.  Squid incorporates
  16.  *  software developed and/or copyrighted by other sources.  Please see
  17.  *  the CREDITS file for full details.
  18.  *
  19.  *  This program is free software; you can redistribute it and/or modify
  20.  *  it under the terms of the GNU General Public License as published by
  21.  *  the Free Software Foundation; either version 2 of the License, or
  22.  *  (at your option) any later version.
  23.  *  
  24.  *  This program is distributed in the hope that it will be useful,
  25.  *  but WITHOUT ANY WARRANTY; without even the implied warranty of
  26.  *  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  27.  *  GNU General Public License for more details.
  28.  *  
  29.  *  You should have received a copy of the GNU General Public License
  30.  *  along with this program; if not, write to the Free Software
  31.  *  Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111, USA.
  32.  *
  33.  */
  34. /*
  35.  * Use these to find memory leaks
  36.  */
  37. #include "squid.h"
  38. static hash_table *htable = NULL;
  39. static int leakCount = 0;
  40. typedef struct _ptr {
  41.     void *key;
  42.     struct _ptr *next;
  43.     const char *file;
  44.     int line;
  45.     time_t when;
  46. } ptr;
  47. static HASHCMP ptr_cmp;
  48. static HASHHASH ptr_hash;
  49. static OBJH ptrDump;
  50. /* ========================================================================= */
  51. void
  52. leakInit(void)
  53. {
  54.     debug(45, 3) ("ptrInitn");
  55.     htable = hash_create(ptr_cmp, 1 << 8, ptr_hash);
  56.     cachemgrRegister("leaks",
  57. "Memory Leak Tracking",
  58. ptrDump, 0, 1);
  59. }
  60. void *
  61. leakAddFL(void *p, const char *file, int line)
  62. {
  63.     ptr *c;
  64.     assert(p);
  65.     assert(htable != NULL);
  66.     assert(hash_lookup(htable, p) == NULL);
  67.     c = xcalloc(1, sizeof(*c));
  68.     c->key = p;
  69.     c->file = file;
  70.     c->line = line;
  71.     c->when = squid_curtime;
  72.     hash_join(htable, (hash_link *) c);
  73.     leakCount++;
  74.     return p;
  75. }
  76. void *
  77. leakTouchFL(void *p, const char *file, int line)
  78. {
  79.     ptr *c = (ptr *) hash_lookup(htable, p);
  80.     assert(p);
  81.     assert(htable != NULL);
  82.     assert(c);
  83.     c->file = file;
  84.     c->line = line;
  85.     c->when = squid_curtime;
  86.     return p;
  87. }
  88. void *
  89. leakFree(void *p)
  90. {
  91.     ptr *c = (ptr *) hash_lookup(htable, p);
  92.     assert(p);
  93.     assert(c != NULL);
  94.     hash_remove_link(htable, (hash_link *) c);
  95.     leakCount--;
  96.     xfree(c);
  97.     return p;
  98. }
  99. /* ========================================================================= */
  100. static int
  101. ptr_cmp(const void *p1, const void *p2)
  102. {
  103.     return (char *) p1 - (char *) p2;
  104. }
  105. static unsigned int
  106. ptr_hash(const void *p, unsigned int mod)
  107. {
  108.     return ((unsigned long) p >> 8) % mod;
  109. }
  110. static void
  111. ptrDump(StoreEntry * sentry)
  112. {
  113.     hash_link *hptr;
  114.     ptr *c;
  115.     storeAppendPrintf(sentry, "Tracking %d pointersn", leakCount);
  116.     hash_first(htable);
  117.     while ((hptr = hash_next(htable))) {
  118. c = (ptr *) hptr;
  119. storeAppendPrintf(sentry, "%20p last used %9d seconds ago by %s:%dn",
  120.     c->key, squid_curtime - c->when, c->file, c->line);
  121.     }
  122. }