t_tls_dynamic.c revision 272979
1251881Speter/*	$NetBSD: t_tls_dynamic.c,v 1.3 2012/01/17 20:34:57 joerg Exp $	*/
2251881Speter/*-
3251881Speter * Copyright (c) 2011 The NetBSD Foundation, Inc.
4251881Speter * All rights reserved.
5251881Speter *
6251881Speter * This code is derived from software contributed to The NetBSD Foundation
7251881Speter * by Joerg Sonnenberger.
8251881Speter *
9251881Speter * Redistribution and use in source and binary forms, with or without
10251881Speter * modification, are permitted provided that the following conditions
11251881Speter * are met:
12251881Speter *
13251881Speter * 1. Redistributions of source code must retain the above copyright
14251881Speter *    notice, this list of conditions and the following disclaimer.
15251881Speter * 2. Redistributions in binary form must reproduce the above copyright
16251881Speter *    notice, this list of conditions and the following disclaimer in
17251881Speter *    the documentation and/or other materials provided with the
18251881Speter *    distribution.
19251881Speter *
20251881Speter * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
21251881Speter * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
22251881Speter * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
23251881Speter * FOR A PARTICULAR PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE
24251881Speter * COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
25251881Speter * INCIDENTAL, SPECIAL, EXEMPLARY OR CONSEQUENTIAL DAMAGES (INCLUDING,
26251881Speter * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
27251881Speter * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
28251881Speter * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
29251881Speter * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT
30251881Speter * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
31251881Speter * SUCH DAMAGE.
32251881Speter */
33251881Speter
34251881Speter#include <sys/cdefs.h>
35251881Speter__RCSID("$NetBSD: t_tls_dynamic.c,v 1.3 2012/01/17 20:34:57 joerg Exp $");
36251881Speter
37251881Speter#include <atf-c.h>
38251881Speter#include <pthread.h>
39251881Speter#include <unistd.h>
40251881Speter
41251881Speter#if defined(__NetBSD__)
42251881Speter#include <sys/tls.h>
43251881Speter#endif
44251881Speter
45251881Speter#ifdef __HAVE_NO___THREAD
46251881Speter#define	__thread
47251881Speter#endif
48251881Speter
49251881SpeterATF_TC(t_tls_dynamic);
50251881Speter
51251881SpeterATF_TC_HEAD(t_tls_dynamic, tc)
52251881Speter{
53251881Speter	atf_tc_set_md_var(tc, "descr",
54251881Speter	    "Test (un)initialized TLS variables in dynamic binaries");
55251881Speter}
56251881Speter
57251881Spetervoid testf_dso_helper(int, int);
58251881Speter
59251881Speterextern __thread int var1;
60251881Speterextern __thread int var2;
61251881Speterextern __thread pid_t (*dso_var1)(void);
62251881Speter
63251881Speter__thread int *var3 = &optind;
64251881Speterint var4_helper;
65251881Speter__thread int *var4 = &var4_helper;
66251881Speter
67251881Speterstatic void *
68251881Spetertestf(void *dummy)
69251881Speter{
70251881Speter	ATF_CHECK_EQ(var1, 1);
71251881Speter	ATF_CHECK_EQ(var2, 0);
72251881Speter	testf_dso_helper(2, 2);
73251881Speter	ATF_CHECK_EQ(var1, 2);
74251881Speter	ATF_CHECK_EQ(var2, 2);
75251881Speter	testf_dso_helper(3, 3);
76251881Speter	ATF_CHECK_EQ(var1, 3);
77251881Speter	ATF_CHECK_EQ(var2, 3);
78251881Speter	ATF_CHECK_EQ(var3, &optind);
79251881Speter	ATF_CHECK_EQ(var4, &var4_helper);
80251881Speter	ATF_CHECK_EQ(dso_var1, getpid);
81251881Speter
82251881Speter	return NULL;
83251881Speter}
84251881Speter
85251881SpeterATF_TC_BODY(t_tls_dynamic, tc)
86251881Speter{
87251881Speter	pthread_t t;
88251881Speter
89251881Speter#ifdef __HAVE_NO___THREAD
90251881Speter	atf_tc_skip("no TLS support on this platform");
91251881Speter#endif
92251881Speter
93251881Speter	testf(NULL);
94251881Speter
95251881Speter	pthread_create(&t, 0, testf, 0);
96251881Speter	pthread_join(t, NULL);
97251881Speter
98251881Speter	pthread_create(&t, 0, testf, 0);
99251881Speter	pthread_join(t, NULL);
100251881Speter}
101251881Speter
102251881SpeterATF_TP_ADD_TCS(tp)
103251881Speter{
104251881Speter	ATF_TP_ADD_TC(tp, t_tls_dynamic);
105251881Speter
106251881Speter	return atf_no_error();
107251881Speter}
108251881Speter