Andrew contribution to add preference method for Fast/Slow speed
[goodguy/cinelerra.git] / cinelerra-5.1 / leaker.C
1 #include <stdio.h>
2 #include <strings.h>
3
4 #include <map>
5 using namespace std;
6
7 #if 0
8 #define STRC(v) printf("==new %p from %p sz %jd\n", v, __builtin_return_address(0), n)
9 #define STRD(v) printf("==del %p from %p\n", v, __builtin_return_address(0))
10 void *operator new(size_t n) { void *vp = malloc(n); STRC(vp); bzero(vp,n); return vp; }
11 void operator delete(void *t) { STRD(t); free(t); }
12 void operator delete(void *t,size_t n) { STRD(t); free(t); }
13 void *operator new[](size_t n) { void *vp = malloc(n); STRC(vp); bzero(vp,n); return vp; }
14 void operator delete[](void *t) { STRD(t); free(t); }
15 void operator delete[](void *t,size_t n) { STRD(t); free(t); }
16 #endif
17
18
19 class blob
20 {
21 public:
22         int64_t adr, from, sz;
23         blob(int64_t adr, int64_t from, int64_t sz) {
24                 this->adr = adr; this->from = from; this->sz = sz;
25         }
26 };
27 typedef map<int64_t, blob*> recd_map;
28 typedef recd_map::value_type recd_val;
29 typedef recd_map::iterator recd_it;
30
31 int main(int ac, char **av)
32 {
33         int64_t adr, from, sz;
34         recd_map recds;
35         char line[65536];
36         FILE *fp = stdin;
37
38         while( fgets(line,sizeof(line),fp) ) {
39                 if( line[0] != '=' ) continue;
40                 if( line[1] != '=' ) continue;
41                 if( sscanf(line, "==new %jx from %jx sz %jd\n", &adr, &from, &sz) == 3 ) {
42                         recds.insert(recd_val(adr, new blob(adr,from,sz)));
43                         continue;
44                 }
45                 if( sscanf(line, "==del %jx from %jx\n", &adr, &from) == 2 ) {
46                         recd_it ri = recds.lower_bound(adr);
47                         if( ri == recds.end() || ri->first != adr ) {
48                                 printf("del miss adr %jx\n", adr);
49                                 continue;
50                         }
51                         recds.erase(ri);
52                 }
53         }
54
55         int64_t n = recds.size();  sz = 0;
56         for( recd_it ri = recds.begin(); ri != recds.end(); ++ri ) sz += ri->second->sz;
57         printf("in use: %jd sz %jd\n", n, sz);
58
59         recd_map leaks;
60         for( recd_it ri = recds.begin(); ri != recds.end(); ++ri ) {
61                 adr = ri->second->adr;  from = ri->second->from;  sz = ri->second->sz;
62                 recd_it li = leaks.lower_bound(from);
63                 if( li == leaks.end() || li->first != from ) {
64                         leaks.insert(recd_val(from, new blob(adr,from,sz)));
65                 }
66                 else {
67                         li->second->sz += sz;
68                 }
69         }
70         sz = 0;  n = 0;
71         for( recd_it li = leaks.begin(); li != leaks.end(); ++li,++n ) {
72                 printf("==leak at %jx sz %jd\n", li->second->from, li->second->sz);
73                 sz += li->second->sz;
74         }
75         printf("leakers: %jd/%jd sz %jd\n", leaks.size(), n, sz);
76         return 0;
77 }
78