Module Name:    src
Committed By:   jruoho
Date:           Wed Jul 28 21:29:16 UTC 2010

Modified Files:
        src/distrib/sets/lists/tests: mi
        src/tests/lib/libpthread: Makefile
Added Files:
        src/tests/lib/libpthread: t_join.c

Log Message:
Add a simple test for pthread_join(3).


To generate a diff of this commit:
cvs rdiff -u -r1.122 -r1.123 src/distrib/sets/lists/tests/mi
cvs rdiff -u -r1.1 -r1.2 src/tests/lib/libpthread/Makefile
cvs rdiff -u -r0 -r1.1 src/tests/lib/libpthread/t_join.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.122 src/distrib/sets/lists/tests/mi:1.123
--- src/distrib/sets/lists/tests/mi:1.122	Wed Jul 28 20:08:45 2010
+++ src/distrib/sets/lists/tests/mi	Wed Jul 28 21:29:16 2010
@@ -1,4 +1,4 @@
-# $NetBSD: mi,v 1.122 2010/07/28 20:08:45 pooka Exp $
+# $NetBSD: mi,v 1.123 2010/07/28 21:29:16 jruoho Exp $
 #
 # Note: don't delete entries from here - mark them as "obsolete" instead.
 #
@@ -301,6 +301,7 @@
 ./usr/libdata/debug/usr/tests/lib/libpthread/t_cond.debug		tests-lib-tests		debug,atf
 ./usr/libdata/debug/usr/tests/lib/libpthread/t_fork.debug		tests-lib-tests		debug,atf
 ./usr/libdata/debug/usr/tests/lib/libpthread/t_fpu.debug		tests-lib-tests		debug,atf
+./usr/libdata/debug/usr/tests/lib/libpthread/t_join.debug		tests-lib-tests		debug,atf
 ./usr/libdata/debug/usr/tests/lib/libpthread/t_kill.debug		tests-lib-tests		debug,atf
 ./usr/libdata/debug/usr/tests/lib/libpthread/t_mutex.debug		tests-lib-tests		debug,atf
 ./usr/libdata/debug/usr/tests/lib/libpthread/t_name.debug		tests-lib-tests		debug,atf
@@ -1433,6 +1434,7 @@
 ./usr/tests/lib/libpthread/t_exit		tests-lib-tests		atf
 ./usr/tests/lib/libpthread/t_fork		tests-lib-tests		atf
 ./usr/tests/lib/libpthread/t_fpu		tests-lib-tests		atf
+./usr/tests/lib/libpthread/t_join		tests-lib-tests		atf
 ./usr/tests/lib/libpthread/t_kill		tests-lib-tests		atf
 ./usr/tests/lib/libpthread/t_mutex		tests-lib-tests		atf
 ./usr/tests/lib/libpthread/t_name		tests-lib-tests		atf

Index: src/tests/lib/libpthread/Makefile
diff -u src/tests/lib/libpthread/Makefile:1.1 src/tests/lib/libpthread/Makefile:1.2
--- src/tests/lib/libpthread/Makefile:1.1	Fri Jul 16 15:42:53 2010
+++ src/tests/lib/libpthread/Makefile	Wed Jul 28 21:29:15 2010
@@ -1,4 +1,4 @@
-# $NetBSD: Makefile,v 1.1 2010/07/16 15:42:53 jmmv Exp $
+# $NetBSD: Makefile,v 1.2 2010/07/28 21:29:15 jruoho Exp $
 
 NOMAN=		# defined
 
@@ -14,6 +14,7 @@
 TESTS_SH+=	t_exit
 TESTS_C+=	t_fork
 TESTS_C+=	t_fpu
+TESTS_C+=	t_join
 TESTS_C+=	t_kill
 TESTS_C+=	t_mutex
 TESTS_C+=	t_name

Added files:

Index: src/tests/lib/libpthread/t_join.c
diff -u /dev/null src/tests/lib/libpthread/t_join.c:1.1
--- /dev/null	Wed Jul 28 21:29:16 2010
+++ src/tests/lib/libpthread/t_join.c	Wed Jul 28 21:29:15 2010
@@ -0,0 +1,153 @@
+/* $NetBSD: t_join.c,v 1.1 2010/07/28 21:29:15 jruoho Exp $ */
+
+/*-
+ * Copyright (c) 2010 The NetBSD Foundation, Inc.
+ * All rights reserved.
+ *
+ * This code is derived from software contributed to The NetBSD Foundation
+ * by Jukka Ruohonen.
+ *
+ * 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 <sys/cdefs.h>
+__RCSID("$NetBSD: t_join.c,v 1.1 2010/07/28 21:29:15 jruoho Exp $");
+
+#include <errno.h>
+#include <pthread.h>
+
+#include <atf-c.h>
+
+#include "h_common.h"
+
+static bool error;
+
+static void *threadfunc1(void *);
+static void *threadfunc2(void *);
+
+ATF_TC(pthread_join);
+ATF_TC_HEAD(pthread_join, tc)
+{
+
+	atf_tc_set_md_var(tc, "descr",
+	    "Checks basic error conditions in pthread_join(3)");
+}
+
+ATF_TC_BODY(pthread_join, tc)
+{
+	pthread_t thread;
+
+	PTHREAD_REQUIRE(pthread_create(&thread, NULL, threadfunc1, NULL));
+	PTHREAD_REQUIRE(pthread_join(thread, NULL));
+}
+
+static void *
+threadfunc1(void *arg)
+{
+	pthread_t thread[25];
+	pthread_t caller;
+	void *val = NULL;
+	size_t i;
+	int rv;
+
+	caller = pthread_self();
+
+	/*
+	 * The behavior is undefined, but should error
+	 * out, if we try to join the calling thread.
+	 */
+	rv = pthread_join(caller, NULL);
+
+	/*
+	 * The specification recommends EDEADLK.
+	 */
+	ATF_REQUIRE(rv != 0);
+	ATF_REQUIRE_EQ(rv, EDEADLK);
+
+	for (i = 0; i < __arraycount(thread); i++) {
+
+		error = true;
+
+		rv = pthread_create(&thread[i], NULL, threadfunc2, (void *)i);
+
+		ATF_REQUIRE_EQ(rv, 0);
+
+		/*
+		 * Try to join an invalid thread.
+		 */
+		rv = pthread_join(thread[i + 1], NULL);
+
+		ATF_REQUIRE_EQ(rv, ESRCH);
+
+		/*
+		 * Check join and exit condition.
+		 */
+		PTHREAD_REQUIRE(pthread_join(thread[i], &val));
+
+		ATF_REQUIRE_EQ(error, false);
+
+		ATF_REQUIRE(val != NULL);
+		ATF_REQUIRE(val == (void *)(i + 1));
+
+		/*
+		 * Once the thread has returned, ESRCH should
+		 * again follow if we try to join it again.
+		 */
+		rv = pthread_join(thread[i], NULL);
+
+		ATF_REQUIRE_EQ(rv, ESRCH);
+
+		/*
+		 * Try to detach the exited thread.
+		 */
+		rv = pthread_detach(thread[i]);
+
+		ATF_REQUIRE(rv != 0);
+	}
+
+	pthread_exit(NULL);
+
+	return NULL;
+}
+
+static void *
+threadfunc2(void *arg)
+{
+	static int i = 0;
+	int j;
+
+	j = (int)arg;
+
+	if (i++ == j)
+		error = false;
+
+	pthread_exit((void *)i);
+
+	return NULL;
+}
+
+ATF_TP_ADD_TCS(tp)
+{
+
+	ATF_TP_ADD_TC(tp, pthread_join);
+
+	return atf_no_error();
+}

Reply via email to