• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /********************************************************************
2  *                                                                  *
3  * THIS FILE IS PART OF THE OggVorbis SOFTWARE CODEC SOURCE CODE.   *
4  * USE, DISTRIBUTION AND REPRODUCTION OF THIS LIBRARY SOURCE IS     *
5  * GOVERNED BY A BSD-STYLE SOURCE LICENSE INCLUDED WITH THIS SOURCE *
6  * IN 'COPYING'. PLEASE READ THESE TERMS BEFORE DISTRIBUTING.       *
7  *                                                                  *
8  * THE OggVorbis SOURCE CODE IS (C) COPYRIGHT 1994-2002             *
9  * by the XIPHOPHORUS Company http://www.xiph.org/                  *
10  *                                                                  *
11  ********************************************************************/
12 
13 #define HEAD_ALIGN 64
14 #include <stdlib.h>
15 #include <string.h>
16 #include <stdio.h>
17 #define MISC_C
18 #include "misc.h"
19 #include <sys/time.h>
20 
21 static void **pointers=NULL;
22 static long *insertlist=NULL; /* We can't embed this in the pointer list;
23 			  a pointer can have any value... */
24 
25 static char **files=NULL;
26 static long *file_bytes=NULL;
27 static int  filecount=0;
28 
29 static int ptop=0;
30 static int palloced=0;
31 static int pinsert=0;
32 
33 typedef struct {
34   char *file;
35   long line;
36   long ptr;
37   long bytes;
38 } head;
39 
40 long global_bytes=0;
41 long start_time=-1;
42 
_insert(void * ptr,long bytes,char * file,long line)43 static void *_insert(void *ptr,long bytes,char *file,long line){
44   ((head *)ptr)->file=file;
45   ((head *)ptr)->line=line;
46   ((head *)ptr)->ptr=pinsert;
47   ((head *)ptr)->bytes=bytes-HEAD_ALIGN;
48 
49   if(pinsert>=palloced){
50     palloced+=64;
51     if(pointers){
52       pointers=(void **)realloc(pointers,sizeof(void **)*palloced);
53       insertlist=(long *)realloc(insertlist,sizeof(long *)*palloced);
54     }else{
55       pointers=(void **)malloc(sizeof(void **)*palloced);
56       insertlist=(long *)malloc(sizeof(long *)*palloced);
57     }
58   }
59 
60   pointers[pinsert]=ptr;
61 
62   if(pinsert==ptop)
63     pinsert=++ptop;
64   else
65     pinsert=insertlist[pinsert];
66 
67 #ifdef _VDBG_GRAPHFILE
68   {
69     FILE *out;
70     struct timeval tv;
71     static struct timezone tz;
72     int i;
73     char buffer[80];
74     gettimeofday(&tv,&tz);
75 
76     for(i=0;i<filecount;i++)
77       if(!strcmp(file,files[i]))break;
78 
79     if(i==filecount){
80       filecount++;
81       if(!files){
82 	files=malloc(filecount*sizeof(*files));
83 	file_bytes=malloc(filecount*sizeof(*file_bytes));
84       }else{
85 	files=realloc(files,filecount*sizeof(*files));
86 	file_bytes=realloc(file_bytes,filecount*sizeof(*file_bytes));
87       }
88       files[i]=strdup(file);
89       file_bytes[i]=0;
90     }
91 
92     file_bytes[i]+=bytes-HEAD_ALIGN;
93 
94     if(start_time==-1)start_time=(tv.tv_sec*1000)+(tv.tv_usec/1000);
95 
96     snprintf(buffer,80,"%s",file);
97     if(strchr(buffer,'.'))strchr(buffer,'.')[0]=0;
98     strcat(buffer,_VDBG_GRAPHFILE);
99     out=fopen(buffer,"a");
100     fprintf(out,"%ld, %ld\n",-start_time+(tv.tv_sec*1000)+(tv.tv_usec/1000),
101 	    file_bytes[i]-(bytes-HEAD_ALIGN));
102     fprintf(out,"%ld, %ld # FILE %s LINE %ld\n",
103 	    -start_time+(tv.tv_sec*1000)+(tv.tv_usec/1000),
104 	    file_bytes[i],file,line);
105     fclose(out);
106 
107     out=fopen("total"_VDBG_GRAPHFILE,"a");
108     fprintf(out,"%ld, %ld\n",-start_time+(tv.tv_sec*1000)+(tv.tv_usec/1000),
109 	    global_bytes);
110     fprintf(out,"%ld, %ld\n",-start_time+(tv.tv_sec*1000)+(tv.tv_usec/1000),
111 	    global_bytes+(bytes-HEAD_ALIGN));
112     fclose(out);
113   }
114 #endif
115 
116   global_bytes+=(bytes-HEAD_ALIGN);
117 
118   return(ptr+HEAD_ALIGN);
119 }
120 
_ripremove(void * ptr)121 static void _ripremove(void *ptr){
122   int insert;
123 
124 #ifdef _VDBG_GRAPHFILE
125   {
126     FILE *out=fopen("total"_VDBG_GRAPHFILE,"a");
127     struct timeval tv;
128     static struct timezone tz;
129     char buffer[80];
130     char *file =((head *)ptr)->file;
131     long bytes =((head *)ptr)->bytes;
132     int i;
133 
134     gettimeofday(&tv,&tz);
135     fprintf(out,"%ld, %ld\n",-start_time+(tv.tv_sec*1000)+(tv.tv_usec/1000),
136 	    global_bytes);
137     fprintf(out,"%ld, %ld\n",-start_time+(tv.tv_sec*1000)+(tv.tv_usec/1000),
138 	    global_bytes-((head *)ptr)->bytes);
139     fclose(out);
140 
141     for(i=0;i<filecount;i++)
142       if(!strcmp(file,files[i]))break;
143 
144     snprintf(buffer,80,"%s",file);
145     if(strchr(buffer,'.'))strchr(buffer,'.')[0]=0;
146     strcat(buffer,_VDBG_GRAPHFILE);
147     out=fopen(buffer,"a");
148     fprintf(out,"%ld, %ld\n",-start_time+(tv.tv_sec*1000)+(tv.tv_usec/1000),
149 	    file_bytes[i]);
150     fprintf(out,"%ld, %ld\n",-start_time+(tv.tv_sec*1000)+(tv.tv_usec/1000),
151 	    file_bytes[i]-bytes);
152     fclose(out);
153 
154     file_bytes[i]-=bytes;
155 
156   }
157 #endif
158 
159   global_bytes-=((head *)ptr)->bytes;
160 
161   insert=((head *)ptr)->ptr;
162   insertlist[insert]=pinsert;
163   pinsert=insert;
164 
165   if(pointers[insert]==NULL){
166     fprintf(stderr,"DEBUGGING MALLOC ERROR: freeing previously freed memory\n");
167     fprintf(stderr,"\t%s %ld\n",((head *)ptr)->file,((head *)ptr)->line);
168   }
169 
170   if(global_bytes<0){
171     fprintf(stderr,"DEBUGGING MALLOC ERROR: freeing unmalloced memory\n");
172   }
173 
174   pointers[insert]=NULL;
175 }
176 
_VDBG_dump(void)177 void _VDBG_dump(void){
178   int i;
179   for(i=0;i<ptop;i++){
180     head *ptr=pointers[i];
181     if(ptr)
182       fprintf(stderr,"unfreed bytes from %s:%ld\n",
183 	      ptr->file,ptr->line);
184   }
185 
186 }
187 
_VDBG_malloc(void * ptr,long bytes,char * file,long line)188 extern void *_VDBG_malloc(void *ptr,long bytes,char *file,long line){
189   bytes+=HEAD_ALIGN;
190   if(ptr){
191     ptr-=HEAD_ALIGN;
192     _ripremove(ptr);
193     ptr=realloc(ptr,bytes);
194   }else{
195     ptr=malloc(bytes);
196     memset(ptr,0,bytes);
197   }
198   return _insert(ptr,bytes,file,line);
199 }
200 
_VDBG_free(void * ptr,char * file,long line)201 extern void _VDBG_free(void *ptr,char *file,long line){
202   if(ptr){
203     ptr-=HEAD_ALIGN;
204     _ripremove(ptr);
205     free(ptr);
206   }
207 }
208 
209