1/*	$NetBSD: thread.c,v 1.2 2011/08/07 14:03:15 rmind Exp $	*/
2
3/*-
4 * Copyright (c) 2010 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * Redistribution and use in source and binary forms, with or without
8 * modification, are permitted provided that the following conditions
9 * are met:
10 * 1. Redistributions of source code must retain the above copyright
11 *    notice, this list of conditions and the following disclaimer.
12 * 2. Redistributions in binary form must reproduce the above copyright
13 *    notice, this list of conditions and the following disclaimer in the
14 *    documentation and/or other materials provided with the distribution.
15 *
16 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND
17 * CONTRIBUTORS ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES,
18 * INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
19 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
20 * IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE
23 * GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
24 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
25 * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR
26 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
27 * IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28 */
29
30#include <sys/cdefs.h>
31#if !defined(lint)
32__RCSID("$NetBSD: thread.c,v 1.2 2011/08/07 14:03:15 rmind Exp $");
33#endif /* !lint */
34
35#include <sys/param.h>
36#include <sys/kernel.h>
37#include <sys/kthread.h>
38#include <sys/mutex.h>
39#include <sys/proc.h>
40
41#include "kernspace.h"
42
43static volatile int testit;
44
45static void
46jointhread(void *arg)
47{
48
49	kpause("take5", false, 1, NULL);
50	testit = 1;
51	kthread_exit(0);
52}
53
54void
55rumptest_threadjoin()
56{
57	struct lwp *newl;
58	int rv;
59
60	rv = kthread_create(PRI_NONE, KTHREAD_MUSTJOIN | KTHREAD_MPSAFE, NULL,
61	    jointhread, NULL, &newl, "jointest");
62	if (rv)
63		panic("thread creation failed: %d", rv);
64	rv = kthread_join(newl);
65	if (rv)
66		panic("thread join failed: %d", rv);
67
68	if (testit != 1)
69		panic("new thread did not run");
70}
71
72static kmutex_t mtx;
73static kcondvar_t cv;
74static int value;
75
76static void
77thethread(void *arg)
78{
79
80	mutex_enter(&mtx);
81	value = 1;
82	cv_signal(&cv);
83	mutex_exit(&mtx);
84
85	kthread_exit(0);
86}
87
88void
89rumptest_thread()
90{
91	struct lwp *newl;
92	int rv;
93
94	mutex_init(&mtx, MUTEX_DEFAULT, IPL_NONE);
95	cv_init(&cv, "jooei");
96	rv = kthread_create(PRI_NONE, KTHREAD_MPSAFE, NULL,
97	    thethread, NULL, &newl, "ktest");
98	if (rv)
99		panic("thread creation failed: %d", rv);
100
101	mutex_enter(&mtx);
102	while (value == 0)
103		cv_wait(&cv, &mtx);
104	mutex_exit(&mtx);
105
106	/* try to verify thread really exists and we don't crash */
107	kpause("take1", false, 1, NULL);
108}
109