xref: /aosp_15_r20/external/libevent/test/regress_finalize.c (revision 663afb9b963571284e0f0a60f257164ab54f64bf)
1*663afb9bSAndroid Build Coastguard Worker /*
2*663afb9bSAndroid Build Coastguard Worker  * Copyright (c) 2013 Niels Provos and Nick Mathewson
3*663afb9bSAndroid Build Coastguard Worker  *
4*663afb9bSAndroid Build Coastguard Worker  * Redistribution and use in source and binary forms, with or without
5*663afb9bSAndroid Build Coastguard Worker  * modification, are permitted provided that the following conditions
6*663afb9bSAndroid Build Coastguard Worker  * are met:
7*663afb9bSAndroid Build Coastguard Worker  * 1. Redistributions of source code must retain the above copyright
8*663afb9bSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer.
9*663afb9bSAndroid Build Coastguard Worker  * 2. Redistributions in binary form must reproduce the above copyright
10*663afb9bSAndroid Build Coastguard Worker  *    notice, this list of conditions and the following disclaimer in the
11*663afb9bSAndroid Build Coastguard Worker  *    documentation and/or other materials provided with the distribution.
12*663afb9bSAndroid Build Coastguard Worker  * 3. The name of the author may not be used to endorse or promote products
13*663afb9bSAndroid Build Coastguard Worker  *    derived from this software without specific prior written permission.
14*663afb9bSAndroid Build Coastguard Worker  *
15*663afb9bSAndroid Build Coastguard Worker  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
16*663afb9bSAndroid Build Coastguard Worker  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
17*663afb9bSAndroid Build Coastguard Worker  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
18*663afb9bSAndroid Build Coastguard Worker  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
19*663afb9bSAndroid Build Coastguard Worker  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
20*663afb9bSAndroid Build Coastguard Worker  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21*663afb9bSAndroid Build Coastguard Worker  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22*663afb9bSAndroid Build Coastguard Worker  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23*663afb9bSAndroid Build Coastguard Worker  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
24*663afb9bSAndroid Build Coastguard Worker  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25*663afb9bSAndroid Build Coastguard Worker  */
26*663afb9bSAndroid Build Coastguard Worker 
27*663afb9bSAndroid Build Coastguard Worker #include "event2/event-config.h"
28*663afb9bSAndroid Build Coastguard Worker #include "evconfig-private.h"
29*663afb9bSAndroid Build Coastguard Worker #include "tinytest.h"
30*663afb9bSAndroid Build Coastguard Worker #include "tinytest_macros.h"
31*663afb9bSAndroid Build Coastguard Worker #include <stdlib.h>
32*663afb9bSAndroid Build Coastguard Worker 
33*663afb9bSAndroid Build Coastguard Worker #include "event2/event.h"
34*663afb9bSAndroid Build Coastguard Worker #include "event2/util.h"
35*663afb9bSAndroid Build Coastguard Worker #include "event-internal.h"
36*663afb9bSAndroid Build Coastguard Worker #include "defer-internal.h"
37*663afb9bSAndroid Build Coastguard Worker 
38*663afb9bSAndroid Build Coastguard Worker #include "regress.h"
39*663afb9bSAndroid Build Coastguard Worker #include "regress_thread.h"
40*663afb9bSAndroid Build Coastguard Worker 
41*663afb9bSAndroid Build Coastguard Worker static void
timer_callback(evutil_socket_t fd,short what,void * arg)42*663afb9bSAndroid Build Coastguard Worker timer_callback(evutil_socket_t fd, short what, void *arg)
43*663afb9bSAndroid Build Coastguard Worker {
44*663afb9bSAndroid Build Coastguard Worker 	int *int_arg = arg;
45*663afb9bSAndroid Build Coastguard Worker 	*int_arg += 1;
46*663afb9bSAndroid Build Coastguard Worker 	(void)fd;
47*663afb9bSAndroid Build Coastguard Worker 	(void)what;
48*663afb9bSAndroid Build Coastguard Worker }
49*663afb9bSAndroid Build Coastguard Worker static void
simple_callback(struct event_callback * evcb,void * arg)50*663afb9bSAndroid Build Coastguard Worker simple_callback(struct event_callback *evcb, void *arg)
51*663afb9bSAndroid Build Coastguard Worker {
52*663afb9bSAndroid Build Coastguard Worker 	int *int_arg = arg;
53*663afb9bSAndroid Build Coastguard Worker         *int_arg += 1;
54*663afb9bSAndroid Build Coastguard Worker 	(void)evcb;
55*663afb9bSAndroid Build Coastguard Worker }
56*663afb9bSAndroid Build Coastguard Worker static void
event_finalize_callback_1(struct event * ev,void * arg)57*663afb9bSAndroid Build Coastguard Worker event_finalize_callback_1(struct event *ev, void *arg)
58*663afb9bSAndroid Build Coastguard Worker {
59*663afb9bSAndroid Build Coastguard Worker 	int *int_arg = arg;
60*663afb9bSAndroid Build Coastguard Worker         *int_arg += 100;
61*663afb9bSAndroid Build Coastguard Worker 	(void)ev;
62*663afb9bSAndroid Build Coastguard Worker }
63*663afb9bSAndroid Build Coastguard Worker static void
callback_finalize_callback_1(struct event_callback * evcb,void * arg)64*663afb9bSAndroid Build Coastguard Worker callback_finalize_callback_1(struct event_callback *evcb, void *arg)
65*663afb9bSAndroid Build Coastguard Worker {
66*663afb9bSAndroid Build Coastguard Worker 	int *int_arg = arg;
67*663afb9bSAndroid Build Coastguard Worker         *int_arg += 100;
68*663afb9bSAndroid Build Coastguard Worker 	(void)evcb;
69*663afb9bSAndroid Build Coastguard Worker }
70*663afb9bSAndroid Build Coastguard Worker 
71*663afb9bSAndroid Build Coastguard Worker 
72*663afb9bSAndroid Build Coastguard Worker static void
test_fin_cb_invoked(void * arg)73*663afb9bSAndroid Build Coastguard Worker test_fin_cb_invoked(void *arg)
74*663afb9bSAndroid Build Coastguard Worker {
75*663afb9bSAndroid Build Coastguard Worker 	struct basic_test_data *data = arg;
76*663afb9bSAndroid Build Coastguard Worker 	struct event_base *base = data->base;
77*663afb9bSAndroid Build Coastguard Worker 
78*663afb9bSAndroid Build Coastguard Worker 	struct event *ev;
79*663afb9bSAndroid Build Coastguard Worker 	struct event ev2;
80*663afb9bSAndroid Build Coastguard Worker 	struct event_callback evcb;
81*663afb9bSAndroid Build Coastguard Worker 	int cb_called = 0;
82*663afb9bSAndroid Build Coastguard Worker 	int ev_called = 0;
83*663afb9bSAndroid Build Coastguard Worker 
84*663afb9bSAndroid Build Coastguard Worker 	const struct timeval ten_sec = {10,0};
85*663afb9bSAndroid Build Coastguard Worker 
86*663afb9bSAndroid Build Coastguard Worker 	event_deferred_cb_init_(&evcb, 0, simple_callback, &cb_called);
87*663afb9bSAndroid Build Coastguard Worker 	ev = evtimer_new(base, timer_callback, &ev_called);
88*663afb9bSAndroid Build Coastguard Worker 	/* Just finalize them; don't bother adding. */
89*663afb9bSAndroid Build Coastguard Worker 	event_free_finalize(0, ev, event_finalize_callback_1);
90*663afb9bSAndroid Build Coastguard Worker 	event_callback_finalize_(base, 0, &evcb, callback_finalize_callback_1);
91*663afb9bSAndroid Build Coastguard Worker 
92*663afb9bSAndroid Build Coastguard Worker 	event_base_dispatch(base);
93*663afb9bSAndroid Build Coastguard Worker 
94*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(cb_called, ==, 100);
95*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(ev_called, ==, 100);
96*663afb9bSAndroid Build Coastguard Worker 
97*663afb9bSAndroid Build Coastguard Worker 	ev_called = cb_called = 0;
98*663afb9bSAndroid Build Coastguard Worker 	event_base_assert_ok_(base);
99*663afb9bSAndroid Build Coastguard Worker 
100*663afb9bSAndroid Build Coastguard Worker 	/* Now try it when they're active. (actually, don't finalize: make
101*663afb9bSAndroid Build Coastguard Worker 	 * sure activation can happen! */
102*663afb9bSAndroid Build Coastguard Worker 	ev = evtimer_new(base, timer_callback, &ev_called);
103*663afb9bSAndroid Build Coastguard Worker 	event_deferred_cb_init_(&evcb, 0, simple_callback, &cb_called);
104*663afb9bSAndroid Build Coastguard Worker 
105*663afb9bSAndroid Build Coastguard Worker 	event_active(ev, EV_TIMEOUT, 1);
106*663afb9bSAndroid Build Coastguard Worker 	event_callback_activate_(base, &evcb);
107*663afb9bSAndroid Build Coastguard Worker 
108*663afb9bSAndroid Build Coastguard Worker 	event_base_dispatch(base);
109*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(cb_called, ==, 1);
110*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(ev_called, ==, 1);
111*663afb9bSAndroid Build Coastguard Worker 
112*663afb9bSAndroid Build Coastguard Worker 	ev_called = cb_called = 0;
113*663afb9bSAndroid Build Coastguard Worker 	event_base_assert_ok_(base);
114*663afb9bSAndroid Build Coastguard Worker 
115*663afb9bSAndroid Build Coastguard Worker 	/* Great, it worked. Now activate and finalize and make sure only
116*663afb9bSAndroid Build Coastguard Worker 	 * finalizing happens. */
117*663afb9bSAndroid Build Coastguard Worker 	event_active(ev, EV_TIMEOUT, 1);
118*663afb9bSAndroid Build Coastguard Worker 	event_callback_activate_(base, &evcb);
119*663afb9bSAndroid Build Coastguard Worker 	event_free_finalize(0, ev, event_finalize_callback_1);
120*663afb9bSAndroid Build Coastguard Worker 	event_callback_finalize_(base, 0, &evcb, callback_finalize_callback_1);
121*663afb9bSAndroid Build Coastguard Worker 
122*663afb9bSAndroid Build Coastguard Worker 	event_base_dispatch(base);
123*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(cb_called, ==, 100);
124*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(ev_called, ==, 100);
125*663afb9bSAndroid Build Coastguard Worker 
126*663afb9bSAndroid Build Coastguard Worker 	ev_called = 0;
127*663afb9bSAndroid Build Coastguard Worker 
128*663afb9bSAndroid Build Coastguard Worker 	event_base_assert_ok_(base);
129*663afb9bSAndroid Build Coastguard Worker 
130*663afb9bSAndroid Build Coastguard Worker 	/* Okay, now add but don't have it become active, and make sure *that*
131*663afb9bSAndroid Build Coastguard Worker 	 * works. */
132*663afb9bSAndroid Build Coastguard Worker 	ev = evtimer_new(base, timer_callback, &ev_called);
133*663afb9bSAndroid Build Coastguard Worker 	event_add(ev, &ten_sec);
134*663afb9bSAndroid Build Coastguard Worker 	event_free_finalize(0, ev, event_finalize_callback_1);
135*663afb9bSAndroid Build Coastguard Worker 
136*663afb9bSAndroid Build Coastguard Worker 	event_base_dispatch(base);
137*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(ev_called, ==, 100);
138*663afb9bSAndroid Build Coastguard Worker 
139*663afb9bSAndroid Build Coastguard Worker 	ev_called = 0;
140*663afb9bSAndroid Build Coastguard Worker 	event_base_assert_ok_(base);
141*663afb9bSAndroid Build Coastguard Worker 
142*663afb9bSAndroid Build Coastguard Worker 	/* Now try adding and deleting after finalizing. */
143*663afb9bSAndroid Build Coastguard Worker 	ev = evtimer_new(base, timer_callback, &ev_called);
144*663afb9bSAndroid Build Coastguard Worker 	evtimer_assign(&ev2, base, timer_callback, &ev_called);
145*663afb9bSAndroid Build Coastguard Worker 	event_add(ev, &ten_sec);
146*663afb9bSAndroid Build Coastguard Worker 	event_free_finalize(0, ev, event_finalize_callback_1);
147*663afb9bSAndroid Build Coastguard Worker 	event_finalize(0, &ev2, event_finalize_callback_1);
148*663afb9bSAndroid Build Coastguard Worker 
149*663afb9bSAndroid Build Coastguard Worker 	event_add(&ev2, &ten_sec);
150*663afb9bSAndroid Build Coastguard Worker 	event_del(ev);
151*663afb9bSAndroid Build Coastguard Worker 	event_active(&ev2, EV_TIMEOUT, 1);
152*663afb9bSAndroid Build Coastguard Worker 
153*663afb9bSAndroid Build Coastguard Worker 	event_base_dispatch(base);
154*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(ev_called, ==, 200);
155*663afb9bSAndroid Build Coastguard Worker 
156*663afb9bSAndroid Build Coastguard Worker 	event_base_assert_ok_(base);
157*663afb9bSAndroid Build Coastguard Worker 
158*663afb9bSAndroid Build Coastguard Worker end:
159*663afb9bSAndroid Build Coastguard Worker 	;
160*663afb9bSAndroid Build Coastguard Worker }
161*663afb9bSAndroid Build Coastguard Worker 
162*663afb9bSAndroid Build Coastguard Worker #ifndef EVENT__DISABLE_MM_REPLACEMENT
163*663afb9bSAndroid Build Coastguard Worker static void *
tfff_malloc(size_t n)164*663afb9bSAndroid Build Coastguard Worker tfff_malloc(size_t n)
165*663afb9bSAndroid Build Coastguard Worker {
166*663afb9bSAndroid Build Coastguard Worker 	return malloc(n);
167*663afb9bSAndroid Build Coastguard Worker }
168*663afb9bSAndroid Build Coastguard Worker static void *tfff_p1=NULL, *tfff_p2=NULL;
169*663afb9bSAndroid Build Coastguard Worker static int tfff_p1_freed=0, tfff_p2_freed=0;
170*663afb9bSAndroid Build Coastguard Worker static void
tfff_free(void * p)171*663afb9bSAndroid Build Coastguard Worker tfff_free(void *p)
172*663afb9bSAndroid Build Coastguard Worker {
173*663afb9bSAndroid Build Coastguard Worker 	if (! p)
174*663afb9bSAndroid Build Coastguard Worker 		return;
175*663afb9bSAndroid Build Coastguard Worker 	if (p == tfff_p1)
176*663afb9bSAndroid Build Coastguard Worker 		++tfff_p1_freed;
177*663afb9bSAndroid Build Coastguard Worker 	if (p == tfff_p2)
178*663afb9bSAndroid Build Coastguard Worker 		++tfff_p2_freed;
179*663afb9bSAndroid Build Coastguard Worker 	free(p);
180*663afb9bSAndroid Build Coastguard Worker }
181*663afb9bSAndroid Build Coastguard Worker static void *
tfff_realloc(void * p,size_t sz)182*663afb9bSAndroid Build Coastguard Worker tfff_realloc(void *p, size_t sz)
183*663afb9bSAndroid Build Coastguard Worker {
184*663afb9bSAndroid Build Coastguard Worker 	return realloc(p,sz);
185*663afb9bSAndroid Build Coastguard Worker }
186*663afb9bSAndroid Build Coastguard Worker #endif
187*663afb9bSAndroid Build Coastguard Worker 
188*663afb9bSAndroid Build Coastguard Worker static void
test_fin_free_finalize(void * arg)189*663afb9bSAndroid Build Coastguard Worker test_fin_free_finalize(void *arg)
190*663afb9bSAndroid Build Coastguard Worker {
191*663afb9bSAndroid Build Coastguard Worker #ifdef EVENT__DISABLE_MM_REPLACEMENT
192*663afb9bSAndroid Build Coastguard Worker 	tinytest_set_test_skipped_();
193*663afb9bSAndroid Build Coastguard Worker #else
194*663afb9bSAndroid Build Coastguard Worker 	struct event_base *base = NULL;
195*663afb9bSAndroid Build Coastguard Worker 	struct event *ev, *ev2;
196*663afb9bSAndroid Build Coastguard Worker 	int ev_called = 0;
197*663afb9bSAndroid Build Coastguard Worker 	int ev2_called = 0;
198*663afb9bSAndroid Build Coastguard Worker 
199*663afb9bSAndroid Build Coastguard Worker 	(void)arg;
200*663afb9bSAndroid Build Coastguard Worker 
201*663afb9bSAndroid Build Coastguard Worker 	event_set_mem_functions(tfff_malloc, tfff_realloc, tfff_free);
202*663afb9bSAndroid Build Coastguard Worker 
203*663afb9bSAndroid Build Coastguard Worker 	base = event_base_new();
204*663afb9bSAndroid Build Coastguard Worker 	tt_assert(base);
205*663afb9bSAndroid Build Coastguard Worker 
206*663afb9bSAndroid Build Coastguard Worker 	ev = evtimer_new(base, timer_callback, &ev_called);
207*663afb9bSAndroid Build Coastguard Worker 	ev2 = evtimer_new(base, timer_callback, &ev2_called);
208*663afb9bSAndroid Build Coastguard Worker 	tfff_p1 = ev;
209*663afb9bSAndroid Build Coastguard Worker 	tfff_p2 = ev2;
210*663afb9bSAndroid Build Coastguard Worker 	event_free_finalize(0, ev, event_finalize_callback_1);
211*663afb9bSAndroid Build Coastguard Worker 	event_finalize(0, ev2, event_finalize_callback_1);
212*663afb9bSAndroid Build Coastguard Worker 
213*663afb9bSAndroid Build Coastguard Worker 	event_base_dispatch(base);
214*663afb9bSAndroid Build Coastguard Worker 
215*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(ev_called, ==, 100);
216*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(ev2_called, ==, 100);
217*663afb9bSAndroid Build Coastguard Worker 
218*663afb9bSAndroid Build Coastguard Worker 	event_base_assert_ok_(base);
219*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(tfff_p1_freed, ==, 1);
220*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(tfff_p2_freed, ==, 0);
221*663afb9bSAndroid Build Coastguard Worker 
222*663afb9bSAndroid Build Coastguard Worker 	event_free(ev2);
223*663afb9bSAndroid Build Coastguard Worker 
224*663afb9bSAndroid Build Coastguard Worker end:
225*663afb9bSAndroid Build Coastguard Worker 	if (base)
226*663afb9bSAndroid Build Coastguard Worker 		event_base_free(base);
227*663afb9bSAndroid Build Coastguard Worker #endif
228*663afb9bSAndroid Build Coastguard Worker }
229*663afb9bSAndroid Build Coastguard Worker 
230*663afb9bSAndroid Build Coastguard Worker /* For test_fin_within_cb */
231*663afb9bSAndroid Build Coastguard Worker struct event_and_count {
232*663afb9bSAndroid Build Coastguard Worker 	struct event *ev;
233*663afb9bSAndroid Build Coastguard Worker 	struct event *ev2;
234*663afb9bSAndroid Build Coastguard Worker 	int count;
235*663afb9bSAndroid Build Coastguard Worker };
236*663afb9bSAndroid Build Coastguard Worker static void
event_finalize_callback_2(struct event * ev,void * arg)237*663afb9bSAndroid Build Coastguard Worker event_finalize_callback_2(struct event *ev, void *arg)
238*663afb9bSAndroid Build Coastguard Worker {
239*663afb9bSAndroid Build Coastguard Worker 	struct event_and_count *evc = arg;
240*663afb9bSAndroid Build Coastguard Worker 	evc->count += 100;
241*663afb9bSAndroid Build Coastguard Worker 	event_free(ev);
242*663afb9bSAndroid Build Coastguard Worker }
243*663afb9bSAndroid Build Coastguard Worker static void
timer_callback_2(evutil_socket_t fd,short what,void * arg)244*663afb9bSAndroid Build Coastguard Worker timer_callback_2(evutil_socket_t fd, short what, void *arg)
245*663afb9bSAndroid Build Coastguard Worker {
246*663afb9bSAndroid Build Coastguard Worker 	struct event_and_count *evc = arg;
247*663afb9bSAndroid Build Coastguard Worker 	event_finalize(0, evc->ev, event_finalize_callback_2);
248*663afb9bSAndroid Build Coastguard Worker 	event_finalize(0, evc->ev2, event_finalize_callback_2);
249*663afb9bSAndroid Build Coastguard Worker 	++ evc->count;
250*663afb9bSAndroid Build Coastguard Worker 	(void)fd;
251*663afb9bSAndroid Build Coastguard Worker 	(void)what;
252*663afb9bSAndroid Build Coastguard Worker }
253*663afb9bSAndroid Build Coastguard Worker 
254*663afb9bSAndroid Build Coastguard Worker static void
test_fin_within_cb(void * arg)255*663afb9bSAndroid Build Coastguard Worker test_fin_within_cb(void *arg)
256*663afb9bSAndroid Build Coastguard Worker {
257*663afb9bSAndroid Build Coastguard Worker 	struct basic_test_data *data = arg;
258*663afb9bSAndroid Build Coastguard Worker 	struct event_base *base = data->base;
259*663afb9bSAndroid Build Coastguard Worker 
260*663afb9bSAndroid Build Coastguard Worker 	struct event_and_count evc1, evc2;
261*663afb9bSAndroid Build Coastguard Worker 	evc1.count = evc2.count = 0;
262*663afb9bSAndroid Build Coastguard Worker 	evc2.ev2 = evc1.ev = evtimer_new(base, timer_callback_2, &evc1);
263*663afb9bSAndroid Build Coastguard Worker 	evc1.ev2 = evc2.ev = evtimer_new(base, timer_callback_2, &evc2);
264*663afb9bSAndroid Build Coastguard Worker 
265*663afb9bSAndroid Build Coastguard Worker 	/* Activate both.  The first one will have its callback run, which
266*663afb9bSAndroid Build Coastguard Worker 	 * will finalize both of them, preventing the second one's callback
267*663afb9bSAndroid Build Coastguard Worker 	 * from running. */
268*663afb9bSAndroid Build Coastguard Worker 	event_active(evc1.ev, EV_TIMEOUT, 1);
269*663afb9bSAndroid Build Coastguard Worker 	event_active(evc2.ev, EV_TIMEOUT, 1);
270*663afb9bSAndroid Build Coastguard Worker 
271*663afb9bSAndroid Build Coastguard Worker 	event_base_dispatch(base);
272*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(evc1.count, ==, 101);
273*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(evc2.count, ==, 100);
274*663afb9bSAndroid Build Coastguard Worker 
275*663afb9bSAndroid Build Coastguard Worker 	event_base_assert_ok_(base);
276*663afb9bSAndroid Build Coastguard Worker 	/* Now try with EV_PERSIST events. */
277*663afb9bSAndroid Build Coastguard Worker 	evc1.count = evc2.count = 0;
278*663afb9bSAndroid Build Coastguard Worker 	evc2.ev2 = evc1.ev = event_new(base, -1, EV_PERSIST, timer_callback_2, &evc1);
279*663afb9bSAndroid Build Coastguard Worker 	evc1.ev2 = evc2.ev = event_new(base, -1, EV_PERSIST, timer_callback_2, &evc2);
280*663afb9bSAndroid Build Coastguard Worker 
281*663afb9bSAndroid Build Coastguard Worker 	event_active(evc1.ev, EV_TIMEOUT, 1);
282*663afb9bSAndroid Build Coastguard Worker 	event_active(evc2.ev, EV_TIMEOUT, 1);
283*663afb9bSAndroid Build Coastguard Worker 
284*663afb9bSAndroid Build Coastguard Worker 	event_base_dispatch(base);
285*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(evc1.count, ==, 101);
286*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(evc2.count, ==, 100);
287*663afb9bSAndroid Build Coastguard Worker 
288*663afb9bSAndroid Build Coastguard Worker 	event_base_assert_ok_(base);
289*663afb9bSAndroid Build Coastguard Worker end:
290*663afb9bSAndroid Build Coastguard Worker 	;
291*663afb9bSAndroid Build Coastguard Worker }
292*663afb9bSAndroid Build Coastguard Worker 
293*663afb9bSAndroid Build Coastguard Worker static void
event_finalize_callback_free(struct event * ev,void * arg)294*663afb9bSAndroid Build Coastguard Worker event_finalize_callback_free(struct event *ev, void *arg)
295*663afb9bSAndroid Build Coastguard Worker {
296*663afb9bSAndroid Build Coastguard Worker 	struct event_base *base = arg;
297*663afb9bSAndroid Build Coastguard Worker 	int err;
298*663afb9bSAndroid Build Coastguard Worker 	if (base) {
299*663afb9bSAndroid Build Coastguard Worker 		err = event_assign(ev, base, -1, EV_TIMEOUT, NULL, NULL);
300*663afb9bSAndroid Build Coastguard Worker 		tt_int_op(err, ==, 0);
301*663afb9bSAndroid Build Coastguard Worker 		test_ok += 1;
302*663afb9bSAndroid Build Coastguard Worker 	} else {
303*663afb9bSAndroid Build Coastguard Worker 		free(ev);
304*663afb9bSAndroid Build Coastguard Worker 		test_ok += 1;
305*663afb9bSAndroid Build Coastguard Worker 	}
306*663afb9bSAndroid Build Coastguard Worker 
307*663afb9bSAndroid Build Coastguard Worker end:
308*663afb9bSAndroid Build Coastguard Worker 	;
309*663afb9bSAndroid Build Coastguard Worker }
310*663afb9bSAndroid Build Coastguard Worker static void
test_fin_debug_use_after_free(void * arg)311*663afb9bSAndroid Build Coastguard Worker test_fin_debug_use_after_free(void *arg)
312*663afb9bSAndroid Build Coastguard Worker {
313*663afb9bSAndroid Build Coastguard Worker 	struct basic_test_data *data = arg;
314*663afb9bSAndroid Build Coastguard Worker 	struct event_base *base = data->base;
315*663afb9bSAndroid Build Coastguard Worker 	struct event *ev;
316*663afb9bSAndroid Build Coastguard Worker 
317*663afb9bSAndroid Build Coastguard Worker 	tt_ptr_op(ev = event_new(base, -1, EV_TIMEOUT, NULL, base), !=, NULL);
318*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(event_add(ev, NULL), ==, 0);
319*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(event_finalize(0, ev, event_finalize_callback_free), ==, 0);
320*663afb9bSAndroid Build Coastguard Worker 
321*663afb9bSAndroid Build Coastguard Worker 	// Dispatch base to trigger callbacks
322*663afb9bSAndroid Build Coastguard Worker 	event_base_dispatch(base);
323*663afb9bSAndroid Build Coastguard Worker 	event_base_assert_ok_(base);
324*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(test_ok, ==, 1);
325*663afb9bSAndroid Build Coastguard Worker 
326*663afb9bSAndroid Build Coastguard Worker 	// Now add again, since we did event_assign in event_finalize_callback_free
327*663afb9bSAndroid Build Coastguard Worker 	// This used to fail in event_debug_assert_is_setup_
328*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(event_add(ev, NULL), ==, 0);
329*663afb9bSAndroid Build Coastguard Worker 
330*663afb9bSAndroid Build Coastguard Worker 	// Finalize and dispatch again
331*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(event_finalize(0, ev, event_finalize_callback_free), ==, 0);
332*663afb9bSAndroid Build Coastguard Worker 	event_base_dispatch(base);
333*663afb9bSAndroid Build Coastguard Worker 	event_base_assert_ok_(base);
334*663afb9bSAndroid Build Coastguard Worker 	tt_int_op(test_ok, ==, 2);
335*663afb9bSAndroid Build Coastguard Worker 
336*663afb9bSAndroid Build Coastguard Worker end:
337*663afb9bSAndroid Build Coastguard Worker 	;
338*663afb9bSAndroid Build Coastguard Worker }
339*663afb9bSAndroid Build Coastguard Worker 
340*663afb9bSAndroid Build Coastguard Worker #if 0
341*663afb9bSAndroid Build Coastguard Worker static void
342*663afb9bSAndroid Build Coastguard Worker timer_callback_3(evutil_socket_t *fd, short what, void *arg)
343*663afb9bSAndroid Build Coastguard Worker {
344*663afb9bSAndroid Build Coastguard Worker 	(void)fd;
345*663afb9bSAndroid Build Coastguard Worker 	(void)what;
346*663afb9bSAndroid Build Coastguard Worker 
347*663afb9bSAndroid Build Coastguard Worker }
348*663afb9bSAndroid Build Coastguard Worker static void
349*663afb9bSAndroid Build Coastguard Worker test_fin_many(void *arg)
350*663afb9bSAndroid Build Coastguard Worker {
351*663afb9bSAndroid Build Coastguard Worker 	struct basic_test_data *data = arg;
352*663afb9bSAndroid Build Coastguard Worker 	struct event_base *base = data->base;
353*663afb9bSAndroid Build Coastguard Worker 
354*663afb9bSAndroid Build Coastguard Worker 	struct event *ev1, *ev2;
355*663afb9bSAndroid Build Coastguard Worker 	struct event_callback evcb1, evcb2;
356*663afb9bSAndroid Build Coastguard Worker 	int ev1_count = 0, ev2_count = 0;
357*663afb9bSAndroid Build Coastguard Worker 	int evcb1_count = 0, evcb2_count = 0;
358*663afb9bSAndroid Build Coastguard Worker 	struct event_callback *array[4];
359*663afb9bSAndroid Build Coastguard Worker 
360*663afb9bSAndroid Build Coastguard Worker 	int n;
361*663afb9bSAndroid Build Coastguard Worker 
362*663afb9bSAndroid Build Coastguard Worker 	/* First attempt: call finalize_many with no events running */
363*663afb9bSAndroid Build Coastguard Worker 	ev1 = evtimer_new(base, timer_callback, &ev1_count);
364*663afb9bSAndroid Build Coastguard Worker 	ev1 = evtimer_new(base, timer_callback, &ev2_count);
365*663afb9bSAndroid Build Coastguard Worker 	event_deferred_cb_init_(&evcb1, 0, simple_callback, &evcb1_called);
366*663afb9bSAndroid Build Coastguard Worker 	event_deferred_cb_init_(&evcb2, 0, simple_callback, &evcb2_called);
367*663afb9bSAndroid Build Coastguard Worker 	array[0] = &ev1->ev_evcallback;
368*663afb9bSAndroid Build Coastguard Worker 	array[1] = &ev2->ev_evcallback;
369*663afb9bSAndroid Build Coastguard Worker 	array[2] = &evcb1;
370*663afb9bSAndroid Build Coastguard Worker 	array[3] = &evcb2;
371*663afb9bSAndroid Build Coastguard Worker 
372*663afb9bSAndroid Build Coastguard Worker 
373*663afb9bSAndroid Build Coastguard Worker 
374*663afb9bSAndroid Build Coastguard Worker 	n = event_callback_finalize_many(base, 4, array,
375*663afb9bSAndroid Build Coastguard Worker 	    callback_finalize_callback_1);
376*663afb9bSAndroid Build Coastguard Worker 
377*663afb9bSAndroid Build Coastguard Worker }
378*663afb9bSAndroid Build Coastguard Worker #endif
379*663afb9bSAndroid Build Coastguard Worker 
380*663afb9bSAndroid Build Coastguard Worker 
381*663afb9bSAndroid Build Coastguard Worker #define TEST(name, flags)					\
382*663afb9bSAndroid Build Coastguard Worker 	{ #name, test_fin_##name, (flags), &basic_setup, NULL }
383*663afb9bSAndroid Build Coastguard Worker 
384*663afb9bSAndroid Build Coastguard Worker struct testcase_t finalize_testcases[] = {
385*663afb9bSAndroid Build Coastguard Worker 
386*663afb9bSAndroid Build Coastguard Worker 	TEST(cb_invoked, TT_FORK|TT_NEED_BASE),
387*663afb9bSAndroid Build Coastguard Worker 	TEST(free_finalize, TT_FORK),
388*663afb9bSAndroid Build Coastguard Worker 	TEST(within_cb, TT_FORK|TT_NEED_BASE),
389*663afb9bSAndroid Build Coastguard Worker 	TEST(debug_use_after_free, TT_FORK|TT_NEED_BASE|TT_ENABLE_DEBUG_MODE),
390*663afb9bSAndroid Build Coastguard Worker //	TEST(many, TT_FORK|TT_NEED_BASE),
391*663afb9bSAndroid Build Coastguard Worker 
392*663afb9bSAndroid Build Coastguard Worker 
393*663afb9bSAndroid Build Coastguard Worker 	END_OF_TESTCASES
394*663afb9bSAndroid Build Coastguard Worker };
395*663afb9bSAndroid Build Coastguard Worker 
396