misc/libtremor/tremor/misc.c
changeset 7697 767d3c4153a1
equal deleted inserted replaced
7696:78a00bc68913 7697:767d3c4153a1
       
     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 
       
    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 
       
   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 
       
   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 
       
   188 extern void *_VDBG_malloc(void *ptr,long bytes,char *file,long line){
       
   189   if(bytes<0) abort();
       
   190   bytes+=HEAD_ALIGN;
       
   191   if(ptr){
       
   192     ptr-=HEAD_ALIGN;
       
   193     _ripremove(ptr);
       
   194     ptr=realloc(ptr,bytes);
       
   195   }else{
       
   196     ptr=malloc(bytes);
       
   197     memset(ptr,0,bytes);
       
   198   }
       
   199   return _insert(ptr,bytes,file,line);
       
   200 }
       
   201 
       
   202 extern void _VDBG_free(void *ptr,char *file,long line){
       
   203   if(ptr){
       
   204     ptr-=HEAD_ALIGN;
       
   205     _ripremove(ptr);
       
   206     free(ptr);
       
   207   }
       
   208 }
       
   209