1*a9ca1710Skamil /* $NetBSD: t_tss.c,v 1.1 2019/04/24 11:43:19 kamil Exp $ */
2*a9ca1710Skamil
3*a9ca1710Skamil /*-
4*a9ca1710Skamil * Copyright (c) 2019 The NetBSD Foundation, Inc.
5*a9ca1710Skamil * All rights reserved.
6*a9ca1710Skamil *
7*a9ca1710Skamil * This code is derived from software contributed to The NetBSD Foundation
8*a9ca1710Skamil * by Kamil Rytarowski.
9*a9ca1710Skamil *
10*a9ca1710Skamil * Redistribution and use in source and binary forms, with or without
11*a9ca1710Skamil * modification, are permitted provided that the following conditions
12*a9ca1710Skamil * are met:
13*a9ca1710Skamil * 1. Redistributions of source code must retain the above copyright
14*a9ca1710Skamil * notice, this list of conditions and the following disclaimer.
15*a9ca1710Skamil * 2. Redistributions in binary form must reproduce the above copyright
16*a9ca1710Skamil * notice, this list of conditions and the following disclaimer in the
17*a9ca1710Skamil * documentation and/or other materials provided with the distribution.
18*a9ca1710Skamil *
19*a9ca1710Skamil * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20*a9ca1710Skamil * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21*a9ca1710Skamil * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22*a9ca1710Skamil * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23*a9ca1710Skamil * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24*a9ca1710Skamil * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25*a9ca1710Skamil * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26*a9ca1710Skamil * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27*a9ca1710Skamil * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28*a9ca1710Skamil * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29*a9ca1710Skamil * POSSIBILITY OF SUCH DAMAGE.
30*a9ca1710Skamil */
31*a9ca1710Skamil
32*a9ca1710Skamil #include <sys/cdefs.h>
33*a9ca1710Skamil __COPYRIGHT("@(#) Copyright (c) 2019\
34*a9ca1710Skamil The NetBSD Foundation, inc. All rights reserved.");
35*a9ca1710Skamil __RCSID("$NetBSD: t_tss.c,v 1.1 2019/04/24 11:43:19 kamil Exp $");
36*a9ca1710Skamil
37*a9ca1710Skamil #include <stdlib.h>
38*a9ca1710Skamil #include <threads.h>
39*a9ca1710Skamil
40*a9ca1710Skamil #include <atf-c.h>
41*a9ca1710Skamil
42*a9ca1710Skamil ATF_TC(tss_create);
ATF_TC_HEAD(tss_create,tc)43*a9ca1710Skamil ATF_TC_HEAD(tss_create, tc)
44*a9ca1710Skamil {
45*a9ca1710Skamil atf_tc_set_md_var(tc, "descr", "Test C11 tss_create(3)");
46*a9ca1710Skamil }
47*a9ca1710Skamil
ATF_TC_BODY(tss_create,tc)48*a9ca1710Skamil ATF_TC_BODY(tss_create, tc)
49*a9ca1710Skamil {
50*a9ca1710Skamil tss_t s;
51*a9ca1710Skamil
52*a9ca1710Skamil ATF_REQUIRE_EQ(tss_create(&s, NULL), thrd_success);
53*a9ca1710Skamil tss_delete(s);
54*a9ca1710Skamil }
55*a9ca1710Skamil
56*a9ca1710Skamil ATF_TC(tss_set);
ATF_TC_HEAD(tss_set,tc)57*a9ca1710Skamil ATF_TC_HEAD(tss_set, tc)
58*a9ca1710Skamil {
59*a9ca1710Skamil atf_tc_set_md_var(tc, "descr", "Test C11 tss_set(3)");
60*a9ca1710Skamil }
61*a9ca1710Skamil
ATF_TC_BODY(tss_set,tc)62*a9ca1710Skamil ATF_TC_BODY(tss_set, tc)
63*a9ca1710Skamil {
64*a9ca1710Skamil tss_t s;
65*a9ca1710Skamil int b = 5;
66*a9ca1710Skamil void *v;
67*a9ca1710Skamil
68*a9ca1710Skamil v = (void *)(intptr_t)b;
69*a9ca1710Skamil
70*a9ca1710Skamil ATF_REQUIRE_EQ(tss_create(&s, NULL), thrd_success);
71*a9ca1710Skamil ATF_REQUIRE_EQ(tss_get(s), NULL);
72*a9ca1710Skamil ATF_REQUIRE_EQ(tss_set(s, v), thrd_success);
73*a9ca1710Skamil ATF_REQUIRE_EQ(tss_get(s), v);
74*a9ca1710Skamil
75*a9ca1710Skamil tss_delete(s);
76*a9ca1710Skamil }
77*a9ca1710Skamil
78*a9ca1710Skamil ATF_TC(tss_destructor_main_thread);
ATF_TC_HEAD(tss_destructor_main_thread,tc)79*a9ca1710Skamil ATF_TC_HEAD(tss_destructor_main_thread, tc)
80*a9ca1710Skamil {
81*a9ca1710Skamil atf_tc_set_md_var(tc, "descr",
82*a9ca1710Skamil "Test C11 tss(3) destructor in main thread");
83*a9ca1710Skamil }
84*a9ca1710Skamil
85*a9ca1710Skamil static void
c_destructor_main(void * arg)86*a9ca1710Skamil c_destructor_main(void *arg)
87*a9ca1710Skamil {
88*a9ca1710Skamil
89*a9ca1710Skamil abort();
90*a9ca1710Skamil }
91*a9ca1710Skamil
ATF_TC_BODY(tss_destructor_main_thread,tc)92*a9ca1710Skamil ATF_TC_BODY(tss_destructor_main_thread, tc)
93*a9ca1710Skamil {
94*a9ca1710Skamil tss_t s;
95*a9ca1710Skamil int b = 5;
96*a9ca1710Skamil void *v;
97*a9ca1710Skamil
98*a9ca1710Skamil v = (void *)(intptr_t)b;
99*a9ca1710Skamil
100*a9ca1710Skamil ATF_REQUIRE_EQ(tss_create(&s, c_destructor_main), thrd_success);
101*a9ca1710Skamil ATF_REQUIRE_EQ(tss_set(s, v), thrd_success);
102*a9ca1710Skamil
103*a9ca1710Skamil tss_delete(s);
104*a9ca1710Skamil
105*a9ca1710Skamil /* Destructor must NOT be called for tss_delete(3) */
106*a9ca1710Skamil }
107*a9ca1710Skamil
108*a9ca1710Skamil ATF_TC(tss_destructor_thread_exit);
ATF_TC_HEAD(tss_destructor_thread_exit,tc)109*a9ca1710Skamil ATF_TC_HEAD(tss_destructor_thread_exit, tc)
110*a9ca1710Skamil {
111*a9ca1710Skamil atf_tc_set_md_var(tc, "descr",
112*a9ca1710Skamil "Test C11 tss(3) destructor on thread exit");
113*a9ca1710Skamil }
114*a9ca1710Skamil
115*a9ca1710Skamil static tss_t s_empty, s_nonempty;
116*a9ca1710Skamil static int c_iter_empty, c_iter_nonempty;
117*a9ca1710Skamil
118*a9ca1710Skamil static void
c_destructor_thread_empty(void * arg)119*a9ca1710Skamil c_destructor_thread_empty(void *arg)
120*a9ca1710Skamil {
121*a9ca1710Skamil
122*a9ca1710Skamil tss_set(s_empty, arg);
123*a9ca1710Skamil ++c_iter_empty;
124*a9ca1710Skamil }
125*a9ca1710Skamil
126*a9ca1710Skamil static void
c_destructor_thread_nonempty(void * arg)127*a9ca1710Skamil c_destructor_thread_nonempty(void *arg)
128*a9ca1710Skamil {
129*a9ca1710Skamil
130*a9ca1710Skamil tss_set(s_nonempty, arg);
131*a9ca1710Skamil ++c_iter_nonempty;
132*a9ca1710Skamil }
133*a9ca1710Skamil
134*a9ca1710Skamil static int
t_func(void * arg __unused)135*a9ca1710Skamil t_func(void *arg __unused)
136*a9ca1710Skamil {
137*a9ca1710Skamil int b = 5;
138*a9ca1710Skamil void *v;
139*a9ca1710Skamil
140*a9ca1710Skamil v = (void *)(intptr_t)b;
141*a9ca1710Skamil
142*a9ca1710Skamil ATF_REQUIRE_EQ(tss_set(s_nonempty, v), thrd_success);
143*a9ca1710Skamil
144*a9ca1710Skamil return 0;
145*a9ca1710Skamil }
146*a9ca1710Skamil
ATF_TC_BODY(tss_destructor_thread_exit,tc)147*a9ca1710Skamil ATF_TC_BODY(tss_destructor_thread_exit, tc)
148*a9ca1710Skamil {
149*a9ca1710Skamil thrd_t t;
150*a9ca1710Skamil
151*a9ca1710Skamil ATF_REQUIRE_EQ(tss_create(&s_empty, c_destructor_thread_empty),
152*a9ca1710Skamil thrd_success);
153*a9ca1710Skamil ATF_REQUIRE_EQ(tss_create(&s_nonempty, c_destructor_thread_nonempty),
154*a9ca1710Skamil thrd_success);
155*a9ca1710Skamil
156*a9ca1710Skamil ATF_REQUIRE_EQ(thrd_create(&t, t_func, NULL), thrd_success);
157*a9ca1710Skamil ATF_REQUIRE_EQ(thrd_join(t, NULL), thrd_success);
158*a9ca1710Skamil
159*a9ca1710Skamil ATF_REQUIRE_EQ(c_iter_empty, 0);
160*a9ca1710Skamil ATF_REQUIRE_EQ(c_iter_nonempty, TSS_DTOR_ITERATIONS);
161*a9ca1710Skamil
162*a9ca1710Skamil tss_delete(s_empty);
163*a9ca1710Skamil tss_delete(s_nonempty);
164*a9ca1710Skamil }
165*a9ca1710Skamil
ATF_TP_ADD_TCS(tp)166*a9ca1710Skamil ATF_TP_ADD_TCS(tp)
167*a9ca1710Skamil {
168*a9ca1710Skamil ATF_TP_ADD_TC(tp, tss_create);
169*a9ca1710Skamil ATF_TP_ADD_TC(tp, tss_set);
170*a9ca1710Skamil ATF_TP_ADD_TC(tp, tss_destructor_main_thread);
171*a9ca1710Skamil ATF_TP_ADD_TC(tp, tss_destructor_thread_exit);
172*a9ca1710Skamil
173*a9ca1710Skamil return atf_no_error();
174*a9ca1710Skamil }
175