4c353ecbbdf32010454deee329715574534950ea
[bbaumbach/samba-autobuild/.git] / source4 / torture / local / talloc.c
1 /* 
2    Unix SMB/CIFS implementation.
3
4    local testing of talloc routines.
5
6    Copyright (C) Andrew Tridgell 2004
7    
8    This program is free software; you can redistribute it and/or modify
9    it under the terms of the GNU General Public License as published by
10    the Free Software Foundation; either version 2 of the License, or
11    (at your option) any later version.
12    
13    This program is distributed in the hope that it will be useful,
14    but WITHOUT ANY WARRANTY; without even the implied warranty of
15    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
16    GNU General Public License for more details.
17    
18    You should have received a copy of the GNU General Public License
19    along with this program; if not, write to the Free Software
20    Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
21 */
22
23 #include "includes.h"
24
25 static struct timeval tp1,tp2;
26
27 static void start_timer(void)
28 {
29         gettimeofday(&tp1,NULL);
30 }
31
32 static double end_timer(void)
33 {
34         gettimeofday(&tp2,NULL);
35         return((tp2.tv_sec - tp1.tv_sec) + 
36                (tp2.tv_usec - tp1.tv_usec)*1.0e-6);
37 }
38
39 /*
40   test references 
41 */
42 static BOOL test_ref1(void)
43 {
44         void *p1, *p2, *ref, *r1;
45
46         printf("TESTING SINGLE REFERENCE FREE\n");
47
48         p1 = talloc_named_const(NULL, 1, "p1");
49         p2 = talloc_named_const(p1, 1, "p2");
50         talloc_named_const(p1, 1, "x1");
51         talloc_named_const(p1, 1, "x2");
52         talloc_named_const(p1, 1, "x3");
53
54         r1 = talloc_named_const(NULL, 1, "r1"); 
55         ref = talloc_reference(r1, p2);
56         talloc_report_full(NULL, stdout);
57
58         printf("Freeing p2\n");
59         talloc_free(p2);
60         talloc_report_full(NULL, stdout);
61
62         printf("Freeing p1\n");
63         talloc_free(p1);
64         talloc_report_full(NULL, stdout);
65
66         printf("Freeing r1\n");
67         talloc_free(r1);
68         talloc_report_full(NULL, stdout);
69
70         if (talloc_total_size(NULL) != 0) {
71                 printf("non-zero total size\n");
72                 return False;
73         }
74
75         return True;
76 }
77
78 /*
79   test references 
80 */
81 static BOOL test_ref2(void)
82 {
83         void *p1, *p2, *ref, *r1;
84
85         printf("TESTING DOUBLE REFERENCE FREE\n");
86
87         p1 = talloc_named_const(NULL, 1, "p1");
88         talloc_named_const(p1, 1, "x1");
89         talloc_named_const(p1, 1, "x2");
90         talloc_named_const(p1, 1, "x3");
91         p2 = talloc_named_const(p1, 1, "p2");
92
93         r1 = talloc_named_const(NULL, 1, "r1"); 
94         ref = talloc_reference(r1, p2);
95         talloc_report_full(NULL, stdout);
96         printf("Freeing ref\n");
97         talloc_free(ref);
98         talloc_report_full(NULL, stdout);
99         printf("Freeing p2\n");
100         talloc_free(p2);
101         talloc_report_full(NULL, stdout);
102         printf("Freeing p1\n");
103         talloc_free(p1);
104         talloc_report_full(NULL, stdout);
105         printf("Freeing r1\n");
106         talloc_free(r1);
107         talloc_report_full(NULL, stdout);
108
109         if (talloc_total_size(NULL) != 0) {
110                 printf("non-zero total size\n");
111                 return False;
112         }
113
114         return True;
115 }
116
117 /*
118   measure the speed of talloc versus malloc
119 */
120 static BOOL test_speed(void)
121 {
122         void *ctx = talloc(NULL, 0);
123         uint_t count;
124
125         printf("MEASURING TALLOC VS MALLOC SPEED\n");
126
127         start_timer();
128         count = 0;
129         do {
130                 void *p1, *p2, *p3;
131                 p1 = talloc(ctx, count);
132                 p2 = talloc_strdup(p1, "foo bar");
133                 p3 = talloc(p1, 300);
134                 talloc_free(p1);
135                 count += 3;
136         } while (end_timer() < 5.0);
137
138         printf("talloc: %.0f ops/sec\n", count/end_timer());
139
140         start_timer();
141         count = 0;
142         do {
143                 void *p1, *p2, *p3;
144                 p1 = malloc(count);
145                 p2 = strdup("foo bar");
146                 p3 = malloc(300);
147                 free(p1);
148                 free(p2);
149                 free(p3);
150                 count += 3;
151         } while (end_timer() < 5.0);
152
153         printf("malloc: %.0f ops/sec\n", count/end_timer());
154
155         return True;    
156 }
157
158
159 BOOL torture_local_talloc(int dummy) 
160 {
161         BOOL ret = True;
162
163         init_iconv();
164
165         ret &= test_ref1();
166         ret &= test_ref2();
167         ret &= test_speed();
168
169         return True;
170 }