r2718: - added a talloc_unreference() function as requested by metze.
[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 /*
26   test references 
27 */
28 static BOOL test_ref1(void)
29 {
30         void *p1, *p2, *ref, *r1;
31
32         printf("TESTING SINGLE REFERENCE FREE\n");
33
34         p1 = talloc_named_const(NULL, 1, "p1");
35         p2 = talloc_named_const(p1, 1, "p2");
36         talloc_named_const(p1, 1, "x1");
37         talloc_named_const(p1, 1, "x2");
38         talloc_named_const(p1, 1, "x3");
39
40         r1 = talloc_named_const(NULL, 1, "r1"); 
41         ref = talloc_reference(r1, p2);
42         talloc_report_full(NULL, stdout);
43
44         printf("Freeing p2\n");
45         talloc_free(p2);
46         talloc_report_full(NULL, stdout);
47
48         printf("Freeing p1\n");
49         talloc_free(p1);
50         talloc_report_full(NULL, stdout);
51
52         printf("Freeing r1\n");
53         talloc_free(r1);
54         talloc_report_full(NULL, stdout);
55
56         if (talloc_total_size(NULL) != 0) {
57                 printf("failed: non-zero total size\n");
58                 return False;
59         }
60
61         return True;
62 }
63
64 /*
65   test references 
66 */
67 static BOOL test_ref2(void)
68 {
69         void *p1, *p2, *ref, *r1;
70
71         printf("TESTING DOUBLE REFERENCE FREE\n");
72
73         p1 = talloc_named_const(NULL, 1, "p1");
74         talloc_named_const(p1, 1, "x1");
75         talloc_named_const(p1, 1, "x2");
76         talloc_named_const(p1, 1, "x3");
77         p2 = talloc_named_const(p1, 1, "p2");
78
79         r1 = talloc_named_const(NULL, 1, "r1"); 
80         ref = talloc_reference(r1, p2);
81         talloc_report_full(NULL, stdout);
82
83         printf("Freeing ref\n");
84         talloc_free(ref);
85         talloc_report_full(NULL, stdout);
86
87         printf("Freeing p2\n");
88         talloc_free(p2);
89         talloc_report_full(NULL, stdout);
90
91         printf("Freeing p1\n");
92         talloc_free(p1);
93         talloc_report_full(NULL, stdout);
94
95         printf("Freeing r1\n");
96         talloc_free(r1);
97         talloc_report_full(NULL, stdout);
98
99         if (talloc_total_size(NULL) != 0) {
100                 printf("failed: non-zero total size\n");
101                 return False;
102         }
103
104         return True;
105 }
106
107 /*
108   test references 
109 */
110 static BOOL test_ref3(void)
111 {
112         void *p1, *p2, *ref, *r1;
113
114         printf("TESTING PARENT REFERENCE FREE\n");
115
116         p1 = talloc_named_const(NULL, 1, "p1");
117         p2 = talloc_named_const(NULL, 1, "p2");
118
119         r1 = talloc_named_const(p1, 1, "r1");
120
121         ref = talloc_reference(p2, r1);
122
123         talloc_report_full(NULL, stdout);
124
125         printf("Freeing p1\n");
126         talloc_free(p1);
127         talloc_report_full(NULL, stdout);
128
129         printf("Freeing p2\n");
130         talloc_free(p2);
131         talloc_report_full(NULL, stdout);
132
133         if (talloc_total_size(NULL) != 0) {
134                 printf("failed: non-zero total size\n");
135                 return False;
136         }
137
138         return True;
139 }
140
141 /*
142   test references 
143 */
144 static BOOL test_ref4(void)
145 {
146         void *p1, *p2, *ref, *r1;
147
148         printf("TESTING REFERRER REFERENCE FREE\n");
149
150         p1 = talloc_named_const(NULL, 1, "p1");
151         talloc_named_const(p1, 1, "x1");
152         talloc_named_const(p1, 1, "x2");
153         talloc_named_const(p1, 1, "x3");
154         p2 = talloc_named_const(p1, 1, "p2");
155
156         r1 = talloc_named_const(NULL, 1, "r1"); 
157         ref = talloc_reference(r1, p2);
158         talloc_report_full(NULL, stdout);
159
160         printf("Freeing r1\n");
161         talloc_free(r1);
162         talloc_report_full(NULL, stdout);
163
164         printf("Freeing p2\n");
165         talloc_free(p2);
166         talloc_report_full(NULL, stdout);
167
168         printf("Freeing p1\n");
169         talloc_free(p1);
170         talloc_report_full(NULL, stdout);
171
172         if (talloc_total_size(NULL) != 0) {
173                 printf("failed: non-zero total size\n");
174                 return False;
175         }
176
177         return True;
178 }
179
180
181 /*
182   test references 
183 */
184 static BOOL test_unref1(void)
185 {
186         void *p1, *p2, *ref, *r1;
187
188         printf("TESTING UNREFERENCE\n");
189
190         p1 = talloc_named_const(NULL, 1, "p1");
191         talloc_named_const(p1, 1, "x1");
192         talloc_named_const(p1, 1, "x2");
193         talloc_named_const(p1, 1, "x3");
194         p2 = talloc_named_const(p1, 1, "p2");
195
196         r1 = talloc_named_const(p1, 1, "r1");   
197         ref = talloc_reference(r1, p2);
198         talloc_report_full(NULL, stdout);
199
200         printf("Unreferencing r1\n");
201         talloc_unreference(r1, p2);
202         talloc_report_full(NULL, stdout);
203
204         printf("Freeing p1\n");
205         talloc_free(p1);
206         talloc_report_full(NULL, stdout);
207
208         if (talloc_total_size(NULL) != 0) {
209                 printf("failed: non-zero total size\n");
210                 return False;
211         }
212
213         return True;
214 }
215
216 /*
217   measure the speed of talloc versus malloc
218 */
219 static BOOL test_speed(void)
220 {
221         void *ctx = talloc(NULL, 0);
222         uint_t count;
223
224         printf("MEASURING TALLOC VS MALLOC SPEED\n");
225
226         start_timer();
227         count = 0;
228         do {
229                 void *p1, *p2, *p3;
230                 p1 = talloc(ctx, count);
231                 p2 = talloc_strdup(p1, "foo bar");
232                 p3 = talloc(p1, 300);
233                 talloc_free(p1);
234                 count += 3;
235         } while (end_timer() < 5.0);
236
237         printf("talloc: %.0f ops/sec\n", count/end_timer());
238
239         talloc_free(ctx);
240
241         start_timer();
242         count = 0;
243         do {
244                 void *p1, *p2, *p3;
245                 p1 = malloc(count);
246                 p2 = strdup("foo bar");
247                 p3 = malloc(300);
248                 free(p1);
249                 free(p2);
250                 free(p3);
251                 count += 3;
252         } while (end_timer() < 5.0);
253
254         printf("malloc: %.0f ops/sec\n", count/end_timer());
255
256         return True;    
257 }
258
259
260 BOOL torture_local_talloc(int dummy) 
261 {
262         BOOL ret = True;
263
264         init_iconv();
265
266         ret &= test_ref1();
267         ret &= test_ref2();
268         ret &= test_ref3();
269         ret &= test_ref4();
270         ret &= test_unref1();
271         ret &= test_speed();
272
273         return ret;
274 }