1 /* $NetBSD: debugrm.c,v 1.3 2006/09/09 16:22:09 manu Exp $ */ 2 3 /* $KAME: debugrm.c,v 1.6 2001/12/13 16:07:46 sakane Exp $ */ 4 5 /* 6 * Copyright (C) 1995, 1996, 1997, and 1998 WIDE Project. 7 * All rights reserved. 8 * 9 * Redistribution and use in source and binary forms, with or without 10 * modification, are permitted provided that the following conditions 11 * are met: 12 * 1. Redistributions of source code must retain the above copyright 13 * notice, this list of conditions and the following disclaimer. 14 * 2. Redistributions in binary form must reproduce the above copyright 15 * notice, this list of conditions and the following disclaimer in the 16 * documentation and/or other materials provided with the distribution. 17 * 3. Neither the name of the project nor the names of its contributors 18 * may be used to endorse or promote products derived from this software 19 * without specific prior written permission. 20 * 21 * THIS SOFTWARE IS PROVIDED BY THE PROJECT AND CONTRIBUTORS ``AS IS'' AND 22 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 23 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 24 * ARE DISCLAIMED. IN NO EVENT SHALL THE PROJECT OR CONTRIBUTORS BE LIABLE 25 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 26 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34 #define NONEED_DRM 35 36 #include "config.h" 37 38 #include <sys/types.h> 39 #include <sys/param.h> 40 41 #include <stdio.h> 42 #include <string.h> 43 #include <stdlib.h> 44 #include <time.h> 45 #include <err.h> 46 47 #include "debugrm.h" 48 49 #include "vmbuf.h" /* need to mask vmbuf.c functions. */ 50 51 #define DRMLISTSIZE 1024 52 53 struct drm_list_t { 54 void *ptr; 55 char msg[100]; 56 }; 57 static struct drm_list_t drmlist[DRMLISTSIZE]; 58 59 static int drm_unknown; 60 61 static void DRM_add __P((void *, char *)); 62 static void DRM_del __P((void *)); 63 static void DRM_setmsg __P((char *, int, void *, int, char *, int, char *)); 64 65 void 66 DRM_init() 67 { 68 int i; 69 drm_unknown = 0; 70 for (i = 0; i < sizeof(drmlist)/sizeof(drmlist[0]); i++) 71 drmlist[i].ptr = 0; 72 } 73 74 void 75 DRM_dump() 76 { 77 FILE *fp; 78 int i; 79 80 fp = fopen(DRMDUMPFILE, "w"); 81 if (fp == NULL) 82 err(1, "fopen"); /*XXX*/ 83 fprintf(fp, "drm_unknown=%d\n", drm_unknown); 84 for (i = 0; i < sizeof(drmlist)/sizeof(drmlist[0]); i++) { 85 if (drmlist[i].ptr) 86 fprintf(fp, "%s\n", drmlist[i].msg); 87 } 88 fclose(fp); 89 } 90 91 static void 92 DRM_add(p, msg) 93 void *p; 94 char *msg; 95 { 96 int i; 97 for (i = 0; i < sizeof(drmlist)/sizeof(drmlist[0]); i++) { 98 if (!drmlist[i].ptr) { 99 drmlist[i].ptr = p; 100 strlcpy(drmlist[i].msg, msg, sizeof(drmlist[i].msg)); 101 return; 102 } 103 } 104 } 105 106 static void 107 DRM_del(p) 108 void *p; 109 { 110 int i; 111 112 if (!p) 113 return; 114 115 for (i = 0; i < sizeof(drmlist)/sizeof(drmlist[0]); i++) { 116 if (drmlist[i].ptr == p) { 117 drmlist[i].ptr = 0; 118 return; 119 } 120 } 121 drm_unknown++; 122 } 123 124 static void 125 DRM_setmsg(buf, buflen, ptr, size, file, line, func) 126 char *buf, *file, *func; 127 int buflen, size, line; 128 void *ptr; 129 { 130 time_t t; 131 struct tm *tm; 132 int len; 133 134 t = time(NULL); 135 tm = localtime(&t); 136 len = strftime(buf, buflen, "%Y/%m/%d:%T ", tm); 137 138 snprintf(buf + len, buflen - len, "%p %6d %s:%d:%s", 139 ptr, size, file , line, func); 140 } 141 142 void * 143 DRM_malloc(file, line, func, size) 144 char *file, *func; 145 int line; 146 size_t size; 147 { 148 void *p; 149 150 p = malloc(size); 151 if (p) { 152 char buf[1024]; 153 DRM_setmsg(buf, sizeof(buf), p, size, file, line, func); 154 DRM_add(p, buf); 155 } 156 157 return p; 158 } 159 160 void * 161 DRM_calloc(file, line, func, number, size) 162 char *file, *func; 163 int line; 164 size_t number, size; 165 { 166 void *p; 167 168 p = calloc(number, size); 169 if (p) { 170 char buf[1024]; 171 DRM_setmsg(buf, sizeof(buf), p, number * size, file, line, func); 172 DRM_add(p, buf); 173 } 174 return p; 175 } 176 177 void * 178 DRM_realloc(file, line, func, ptr, size) 179 char *file, *func; 180 int line; 181 void *ptr; 182 size_t size; 183 { 184 void *p; 185 186 p = realloc(ptr, size); 187 if (p) { 188 char buf[1024]; 189 if (ptr && p != ptr) { 190 DRM_del(ptr); 191 DRM_setmsg(buf, sizeof(buf), p, size, file, line, func); 192 DRM_add(p, buf); 193 } 194 } 195 196 return p; 197 } 198 199 void 200 DRM_free(file, line, func, ptr) 201 char *file, *func; 202 int line; 203 void *ptr; 204 { 205 DRM_del(ptr); 206 free(ptr); 207 } 208 209 char * 210 DRM_strdup(file, line, func, str) 211 char *file, *func; 212 int line; 213 const char *str; 214 { 215 char *p; 216 217 p = strdup(str); 218 219 if (p) { 220 char buf[1024]; 221 DRM_setmsg(buf, sizeof(buf), p, size, file, line, func); 222 DRM_add(p, buf); 223 } 224 225 return p; 226 } 227 228 /* 229 * mask vmbuf.c functions. 230 */ 231 void * 232 DRM_vmalloc(file, line, func, size) 233 char *file, *func; 234 int line; 235 size_t size; 236 { 237 void *p; 238 239 p = vmalloc(size); 240 if (p) { 241 char buf[1024]; 242 DRM_setmsg(buf, sizeof(buf), p, size, file, line, func); 243 DRM_add(p, buf); 244 } 245 246 return p; 247 } 248 249 void * 250 DRM_vrealloc(file, line, func, ptr, size) 251 char *file, *func; 252 int line; 253 void *ptr; 254 size_t size; 255 { 256 void *p; 257 258 p = vrealloc(ptr, size); 259 if (p) { 260 char buf[1024]; 261 if (ptr && p != ptr) { 262 DRM_del(ptr); 263 DRM_setmsg(buf, sizeof(buf), p, size, file, line, func); 264 DRM_add(p, buf); 265 } 266 } 267 268 return p; 269 } 270 271 void 272 DRM_vfree(file, line, func, ptr) 273 char *file, *func; 274 int line; 275 void *ptr; 276 { 277 DRM_del(ptr); 278 vfree(ptr); 279 } 280 281 void * 282 DRM_vdup(file, line, func, ptr) 283 char *file, *func; 284 int line; 285 void *ptr; 286 { 287 void *p; 288 289 p = vdup(ptr); 290 if (p) { 291 char buf[1024]; 292 DRM_setmsg(buf, sizeof(buf), p, 0, file, line, func); 293 DRM_add(p, buf); 294 } 295 296 return p; 297 } 298