Module Name:    src
Committed By:   joerg
Date:           Thu Mar 31 23:34:48 UTC 2011

Modified Files:
        src/distrib/sets/lists/tests: mi
        src/tests/libexec/ld.elf_so: Makefile
Added Files:
        src/tests/libexec/ld.elf_so: h_locking.c
        src/tests/libexec/ld.elf_so/helper_dso1: Makefile h_helper_dso1.c
        src/tests/libexec/ld.elf_so/helper_dso2: Makefile h_helper_dso2.c

Log Message:
Add initial regression test for ld.elf_so locking.


To generate a diff of this commit:
cvs rdiff -u -r1.283 -r1.284 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.3 -r1.4 src/tests/libexec/ld.elf_so/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/libexec/ld.elf_so/h_locking.c
cvs rdiff -u -r0 -r1.1 src/tests/libexec/ld.elf_so/helper_dso1/Makefile \
    src/tests/libexec/ld.elf_so/helper_dso1/h_helper_dso1.c
cvs rdiff -u -r0 -r1.1 src/tests/libexec/ld.elf_so/helper_dso2/Makefile \
    src/tests/libexec/ld.elf_so/helper_dso2/h_helper_dso2.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/distrib/sets/lists/tests/mi
diff -u src/distrib/sets/lists/tests/mi:1.283 src/distrib/sets/lists/tests/mi:1.284
--- src/distrib/sets/lists/tests/mi:1.283	Thu Mar 31 15:47:56 2011
+++ src/distrib/sets/lists/tests/mi	Thu Mar 31 23:34:48 2011
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.283 2011/03/31 15:47:56 jruoho Exp $
+# $NetBSD: mi,v 1.284 2011/03/31 23:34:48 joerg Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -508,6 +508,9 @@
 ./usr/libdata/debug/usr/tests/libexec/ld.elf_so				tests-libexec-debug
 ./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_df_1_noopen1.debug	tests-libexec-debug	debug,atf
 ./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_df_1_noopen2.debug	tests-libexec-debug	debug,atf
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/h_locking.debug	tests-libexec-debug	debug,atf
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/libh_helper_dso1.so.1.debug	tests-libexec-debug	debug,atf
+./usr/libdata/debug/usr/tests/libexec/ld.elf_so/libh_helper_dso2.so.1.debug	tests-libexec-debug	debug,atf
 ./usr/libdata/debug/usr/tests/libexec/ld.elf_so/t_dlerror-cleared.debug	tests-libexec-debug	debug,atf
 ./usr/libdata/debug/usr/tests/libexec/ld.elf_so/t_dlerror-false.debug	tests-libexec-debug	debug,atf
 ./usr/libdata/debug/usr/tests/libexec/ld.elf_so/t_dlinfo.debug		tests-libexec-debug	debug,atf
@@ -2000,6 +2003,11 @@
 ./usr/tests/libexec/ld.elf_so/Atffile		tests-libexec-tests	atf
 ./usr/tests/libexec/ld.elf_so/h_df_1_noopen1	tests-libexec-tests	atf
 ./usr/tests/libexec/ld.elf_so/h_df_1_noopen2	tests-libexec-tests	atf
+./usr/tests/libexec/ld.elf_so/h_locking		tests-libexec-tests	atf
+./usr/tests/libexec/ld.elf_so/libh_helper_dso1.so	tests-libexec-tests	atf
+./usr/tests/libexec/ld.elf_so/libh_helper_dso1.so.1	tests-libexec-tests	atf
+./usr/tests/libexec/ld.elf_so/libh_helper_dso2.so	tests-libexec-tests	atf
+./usr/tests/libexec/ld.elf_so/libh_helper_dso2.so.1	tests-libexec-tests	atf
 ./usr/tests/libexec/ld.elf_so/t_df_1_noopen	tests-libexec-tests	atf
 ./usr/tests/libexec/ld.elf_so/t_dlerror-cleared	tests-libexec-tests	atf
 ./usr/tests/libexec/ld.elf_so/t_dlerror-false	tests-libexec-tests	atf

Index: src/tests/libexec/ld.elf_so/Makefile
diff -u src/tests/libexec/ld.elf_so/Makefile:1.3 src/tests/libexec/ld.elf_so/Makefile:1.4
--- src/tests/libexec/ld.elf_so/Makefile:1.3	Fri Dec 24 12:41:43 2010
+++ src/tests/libexec/ld.elf_so/Makefile	Thu Mar 31 23:34:47 2011
@@ -5,6 +5,8 @@
 
 .include <bsd.own.mk>
 
+SUBDIR+=	helper_dso1 .WAIT helper_dso2
+
 TESTSDIR=	${TESTSBASE}/libexec/ld.elf_so
 
 TESTS_C+=	t_dlerror-cleared t_dlerror-false t_dlinfo
@@ -21,4 +23,8 @@
 SRCS.h_df_1_noopen2=	h_df_1_noopen.c
 LDADD.h_df_1_noopen2=	-lpthread
 
+PROGS+=			h_locking
+SRCS.h_locking=		h_locking.c
+LDADD.h_locking=	-lpthread -Wl,--export-dynamic -Wl,-rpath,${TESTSDIR}
+
 .include <bsd.test.mk>

Added files:

Index: src/tests/libexec/ld.elf_so/h_locking.c
diff -u /dev/null src/tests/libexec/ld.elf_so/h_locking.c:1.1
--- /dev/null	Thu Mar 31 23:34:48 2011
+++ src/tests/libexec/ld.elf_so/h_locking.c	Thu Mar 31 23:34:47 2011
@@ -0,0 +1,149 @@
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Joerg Sonnenberger.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <dlfcn.h>
+#include <link_elf.h>
+#include <pthread.h>
+#include <stdlib.h>
+#include <stdio.h>
+#include <string.h>
+#include <unistd.h>
+
+int sleep_init;
+int sleep_fini;
+int dlopen_cookie;
+int dlclose_cookie;
+
+void (*tls_callback_sym)(void);
+
+static int
+dl_iterate_phdr_cb(struct dl_phdr_info *info, size_t size, void *data)
+{
+	(*tls_callback_sym)();
+	return 0;
+}
+
+static void *
+test_dl_iterate_phdr_helper(void *dummy)
+{
+	sleep(10);
+	_exit(1);
+}
+
+static void
+test_dl_iterate_phdr(void)
+{
+	pthread_t t;
+	void *dso;
+	sleep_init = 0;
+	sleep_fini = 0;
+	if ((dso = dlopen("libh_helper_dso2.so", RTLD_LAZY)) == NULL) {
+		fprintf(stderr, "opening helper failed\n");
+		_exit(1);
+	}
+	tls_callback_sym = dlsym(dso, "tls_callback");
+	if (tls_callback_sym == NULL) {
+		fprintf(stderr, "bad helper\n");
+		_exit(1);
+	}
+	pthread_create(&t, NULL, test_dl_iterate_phdr_helper, NULL);
+	if (dl_iterate_phdr(dl_iterate_phdr_cb, NULL))
+		_exit(1);
+	_exit(0);
+}
+
+static void *
+init_fini_helper(void *arg)
+{
+	void *dso;
+	if ((dso = dlopen(arg, RTLD_LAZY)) == NULL) {
+		fprintf(stderr, "opening %s failed\n", (char *)arg);
+		exit(1);
+	}
+	dlclose(dso);
+	return NULL;
+}
+
+static void
+test_dlopen(void)
+{
+	pthread_t t1, t2;
+	sleep_init = 1;
+	sleep_fini = 0;
+	printf("%d\n", dlopen_cookie);
+	pthread_create(&t1, NULL, init_fini_helper,
+	    __UNCONST("libh_helper_dso2.so"));
+	sleep(1);
+	printf("%d\n", dlopen_cookie);
+	if (dlopen_cookie != 1)
+		_exit(1);
+	sleep(1);
+	pthread_create(&t2, NULL, init_fini_helper,
+	    __UNCONST("libutil.so"));
+	printf("%d\n", dlopen_cookie);
+	if (dlopen_cookie != 1)
+		_exit(1);
+	_exit(0);
+}
+
+static void
+test_dlclose(void)
+{
+	pthread_t t1, t2;
+	sleep_init = 0;
+	sleep_fini = 1;
+	printf("%d\n", dlclose_cookie);
+	pthread_create(&t1, NULL, init_fini_helper,
+	    __UNCONST("libh_helper_dso2.so"));
+	sleep(1);
+	printf("%d\n", dlclose_cookie);
+	if (dlclose_cookie != 2)
+		_exit(1);
+	pthread_create(&t2, NULL, init_fini_helper,
+	    __UNCONST("libutil.so"));
+	sleep(1);
+	printf("%d\n", dlclose_cookie);
+	if (dlclose_cookie != 2)
+		_exit(1);
+	_exit(0);
+}
+
+int
+main(int argc, char **argv)
+{
+	if (argc != 2)
+		return 1;
+	if (strcmp(argv[1], "dl_iterate_phdr") == 0)
+		test_dl_iterate_phdr();
+	if (strcmp(argv[1], "dlopen") == 0)
+		test_dlopen();
+	if (strcmp(argv[1], "dlclose") == 0)
+		test_dlclose();
+	return 1;
+}

Index: src/tests/libexec/ld.elf_so/helper_dso1/Makefile
diff -u /dev/null src/tests/libexec/ld.elf_so/helper_dso1/Makefile:1.1
--- /dev/null	Thu Mar 31 23:34:48 2011
+++ src/tests/libexec/ld.elf_so/helper_dso1/Makefile	Thu Mar 31 23:34:48 2011
@@ -0,0 +1,19 @@
+# $NetBSD: Makefile,v 1.1 2011/03/31 23:34:48 joerg Exp $
+
+.include <bsd.own.mk>
+
+LIB=			h_helper_dso1
+SRCS=			h_helper_dso1.c
+
+LIBDIR=		${TESTSBASE}/libexec/ld.elf_so
+SHLIBDIR=	${TESTSBASE}/libexec/ld.elf_so
+SHLIB_MAJOR=	1
+
+MKSTATICLIB=	no
+MKPROFILE=	no
+MKPICINSTALL=	no
+MKLINT=		no
+
+NOMAN=		# defined
+
+.include <bsd.lib.mk>
Index: src/tests/libexec/ld.elf_so/helper_dso1/h_helper_dso1.c
diff -u /dev/null src/tests/libexec/ld.elf_so/helper_dso1/h_helper_dso1.c:1.1
--- /dev/null	Thu Mar 31 23:34:48 2011
+++ src/tests/libexec/ld.elf_so/helper_dso1/h_helper_dso1.c	Thu Mar 31 23:34:48 2011
@@ -0,0 +1,65 @@
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Joerg Sonnenberger.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <poll.h>
+#include <stddef.h>
+
+extern int sleep_init;
+extern int sleep_fini;
+extern int dlopen_cookie;
+
+void __attribute__((__constructor__))
+init1(void)
+{
+	dlopen_cookie = 1;
+	if (!sleep_init)
+		return;
+	for (;;)
+		poll(NULL, 0, -1);
+}
+
+extern int dlclose_cookie;
+
+void __attribute__((__destructor__))
+fini1(void)
+{
+	dlclose_cookie = 1;
+	if (!sleep_fini)
+		return;
+	for (;;)
+		poll(NULL, 0, -1);
+}
+
+static __thread int tls_callback_var;
+
+void
+tls_callback(void)
+{
+	tls_callback_var = 1;
+}

Index: src/tests/libexec/ld.elf_so/helper_dso2/Makefile
diff -u /dev/null src/tests/libexec/ld.elf_so/helper_dso2/Makefile:1.1
--- /dev/null	Thu Mar 31 23:34:48 2011
+++ src/tests/libexec/ld.elf_so/helper_dso2/Makefile	Thu Mar 31 23:34:48 2011
@@ -0,0 +1,22 @@
+# $NetBSD: Makefile,v 1.1 2011/03/31 23:34:48 joerg Exp $
+
+.include <bsd.own.mk>
+
+LIB=			h_helper_dso2
+SRCS=			h_helper_dso2.c
+
+DSO1DIR!=	cd ${.CURDIR}/../helper_dso1 && ${PRINTOBJDIR}
+LDADD+=		-Wl,-rpath,${TESTSDIR} -L${DSO1DIR} -lh_helper_dso1
+
+LIBDIR=		${TESTSBASE}/libexec/ld.elf_so
+SHLIBDIR=	${TESTSBASE}/libexec/ld.elf_so
+SHLIB_MAJOR=	1
+
+MKSTATICLIB=	no
+MKPROFILE=	no
+MKPICINSTALL=	no
+MKLINT=		no
+
+NOMAN=		# defined
+
+.include <bsd.lib.mk>
Index: src/tests/libexec/ld.elf_so/helper_dso2/h_helper_dso2.c
diff -u /dev/null src/tests/libexec/ld.elf_so/helper_dso2/h_helper_dso2.c:1.1
--- /dev/null	Thu Mar 31 23:34:48 2011
+++ src/tests/libexec/ld.elf_so/helper_dso2/h_helper_dso2.c	Thu Mar 31 23:34:48 2011
@@ -0,0 +1,57 @@
+/*-
+ * Copyright (c) 2011 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Joerg Sonnenberger.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ *    notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ *    notice, this list of conditions and the following disclaimer in the
+ *    documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+#include <poll.h>
+#include <stddef.h>
+
+extern int sleep_init;
+extern int sleep_fini;
+extern int dlopen_cookie;
+
+void __attribute__((__constructor__))
+init2(void)
+{
+	dlopen_cookie = 2;
+	if (!sleep_init)
+		return;
+	for (;;)
+		poll(NULL, 0, -1);
+}
+
+extern int dlclose_cookie;
+
+void __attribute__((__destructor__))
+fini2(void)
+{
+	dlclose_cookie = 2;
+	if (!sleep_fini)
+		return;
+	for (;;)
+		poll(NULL, 0, -1);
+}

Reply via email to