several extremely minor fixes
[platform/upstream/libvorbis.git] / lib / misc.c
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-2001             *
9  * by the XIPHOPHORUS Company http://www.xiph.org/                  *
10  *                                                                  *
11  ********************************************************************/
12
13 #define HEAD_ALIGN 32
14 #include <pthread.h>
15 #include <stdlib.h>
16 #include <stdio.h>
17 #include "vorbis/codec.h"
18 #define MISC_C
19 #include "misc.h"
20
21 static pthread_mutex_t memlock=PTHREAD_MUTEX_INITIALIZER;
22 void **pointers=NULL;
23 long *insertlist=NULL; /* We can't embed this in the pointer list;
24                           a pointer can have any value... */
25 int ptop=0;
26 int palloced=0;
27 int pinsert=0;
28
29 typedef struct {
30   char *file;
31   long line;
32   long ptr;
33 } head;
34
35 static void *_insert(void *ptr,char *file,long line){
36   ((head *)ptr)->file=file;
37   ((head *)ptr)->line=line;
38   ((head *)ptr)->ptr=pinsert;
39
40   pthread_mutex_lock(&memlock);
41   if(pinsert>=palloced){
42     palloced+=64;
43     if(pointers){
44       pointers=(void **)realloc(pointers,sizeof(void **)*palloced);
45       insertlist=(long *)realloc(insertlist,sizeof(long *)*palloced);
46     }else{
47       pointers=(void **)malloc(sizeof(void **)*palloced);
48       insertlist=(long *)malloc(sizeof(long *)*palloced);
49     }
50   }
51
52   pointers[pinsert]=ptr;
53
54   if(pinsert==ptop)
55     pinsert=++ptop;
56   else
57     pinsert=insertlist[pinsert];
58   
59   pthread_mutex_unlock(&memlock);
60   return(ptr+HEAD_ALIGN);
61 }
62
63 static void _ripremove(void *ptr){
64   int insert;
65   pthread_mutex_lock(&memlock);
66   insert=((head *)ptr)->ptr;
67   insertlist[insert]=pinsert;
68   pinsert=insert;
69   pointers[insert]=NULL;
70   pthread_mutex_unlock(&memlock);
71 }
72
73 void _VDBG_dump(void){
74   int i;
75   pthread_mutex_lock(&memlock);
76   for(i=0;i<ptop;i++){
77     head *ptr=pointers[i];
78     if(ptr)
79       fprintf(stderr,"unfreed bytes from %s:%ld\n",
80               ptr->file,ptr->line);
81   }
82
83   pthread_mutex_unlock(&memlock);
84 }
85
86 extern void *_VDBG_malloc(void *ptr,long bytes,char *file,long line){
87   bytes+=HEAD_ALIGN;
88   if(ptr){
89     ptr-=HEAD_ALIGN;
90     _ripremove(ptr);
91     ptr=realloc(ptr,bytes);
92   }else{
93     ptr=malloc(bytes);
94     memset(ptr,0,bytes);
95   }
96   return _insert(ptr,file,line);
97 }
98
99 extern void _VDBG_free(void *ptr,char *file,long line){
100   if(ptr){
101     ptr-=HEAD_ALIGN;
102     _ripremove(ptr);
103     free(ptr);
104   }
105 }
106