xref: /titanic_51/usr/src/lib/libfakekernel/common/thread.c (revision b819cea2f73f98c5662230cc9affc8cc84f77fcf)
1*b819cea2SGordon Ross /*
2*b819cea2SGordon Ross  * This file and its contents are supplied under the terms of the
3*b819cea2SGordon Ross  * Common Development and Distribution License ("CDDL"), version 1.0.
4*b819cea2SGordon Ross  * You may only use this file in accordance with the terms of version
5*b819cea2SGordon Ross  * 1.0 of the CDDL.
6*b819cea2SGordon Ross  *
7*b819cea2SGordon Ross  * A full copy of the text of the CDDL should have accompanied this
8*b819cea2SGordon Ross  * source.  A copy of the CDDL is also available via the Internet at
9*b819cea2SGordon Ross  * http://www.illumos.org/license/CDDL.
10*b819cea2SGordon Ross  */
11*b819cea2SGordon Ross 
12*b819cea2SGordon Ross /*
13*b819cea2SGordon Ross  * Copyright 2013 Nexenta Systems, Inc.  All rights reserved.
14*b819cea2SGordon Ross  */
15*b819cea2SGordon Ross 
16*b819cea2SGordon Ross #include <sys/cmn_err.h>
17*b819cea2SGordon Ross #include <sys/thread.h>
18*b819cea2SGordon Ross #include <sys/zone.h>
19*b819cea2SGordon Ross 
20*b819cea2SGordon Ross #define	_SYNCH_H	/* keep out <synch.h> */
21*b819cea2SGordon Ross #include <thread.h>
22*b819cea2SGordon Ross 
23*b819cea2SGordon Ross /*
24*b819cea2SGordon Ross  * Get the current kthread_t pointer.
25*b819cea2SGordon Ross  */
26*b819cea2SGordon Ross kthread_t *
27*b819cea2SGordon Ross _curthread(void)
28*b819cea2SGordon Ross {
29*b819cea2SGordon Ross 	thread_t tid;
30*b819cea2SGordon Ross 
31*b819cea2SGordon Ross 	tid = thr_self();
32*b819cea2SGordon Ross 	return ((kthread_t *)(uintptr_t)tid);
33*b819cea2SGordon Ross }
34*b819cea2SGordon Ross 
35*b819cea2SGordon Ross /*
36*b819cea2SGordon Ross  * Create a thread.
37*b819cea2SGordon Ross  *
38*b819cea2SGordon Ross  * thread_create() blocks for memory if necessary.  It never fails.
39*b819cea2SGordon Ross  */
40*b819cea2SGordon Ross /* ARGSUSED */
41*b819cea2SGordon Ross kthread_t *
42*b819cea2SGordon Ross thread_create(
43*b819cea2SGordon Ross 	caddr_t	stk,
44*b819cea2SGordon Ross 	size_t	stksize,
45*b819cea2SGordon Ross 	void	(*func)(),
46*b819cea2SGordon Ross 	void	*arg,
47*b819cea2SGordon Ross 	size_t	len,
48*b819cea2SGordon Ross 	struct proc *pp,
49*b819cea2SGordon Ross 	int	state,
50*b819cea2SGordon Ross 	pri_t	pri)
51*b819cea2SGordon Ross {
52*b819cea2SGordon Ross 	void * (*thr_func)(void *);
53*b819cea2SGordon Ross 	thread_t newtid;
54*b819cea2SGordon Ross 	int thr_flags = 0;
55*b819cea2SGordon Ross 	int rc;
56*b819cea2SGordon Ross 
57*b819cea2SGordon Ross 	thr_flags = THR_BOUND;
58*b819cea2SGordon Ross 
59*b819cea2SGordon Ross 	switch (state) {
60*b819cea2SGordon Ross 	case TS_RUN:
61*b819cea2SGordon Ross 	case TS_ONPROC:
62*b819cea2SGordon Ross 		break;
63*b819cea2SGordon Ross 	case TS_STOPPED:
64*b819cea2SGordon Ross 		thr_flags |= THR_SUSPENDED;
65*b819cea2SGordon Ross 		break;
66*b819cea2SGordon Ross 	default:
67*b819cea2SGordon Ross 		cmn_err(CE_PANIC, "thread_create: invalid state");
68*b819cea2SGordon Ross 		break;
69*b819cea2SGordon Ross 	}
70*b819cea2SGordon Ross 
71*b819cea2SGordon Ross 	thr_func = (void *(*)(void *))func;
72*b819cea2SGordon Ross 	rc = thr_create(NULL, 0, thr_func, arg, thr_flags, &newtid);
73*b819cea2SGordon Ross 	if (rc != 0)
74*b819cea2SGordon Ross 		cmn_err(CE_PANIC, "thread_create failed, rc=%d", rc);
75*b819cea2SGordon Ross 
76*b819cea2SGordon Ross 	return ((void *)(uintptr_t)newtid);
77*b819cea2SGordon Ross }
78*b819cea2SGordon Ross 
79*b819cea2SGordon Ross void
80*b819cea2SGordon Ross thread_exit(void)
81*b819cea2SGordon Ross {
82*b819cea2SGordon Ross 	thr_exit(NULL);
83*b819cea2SGordon Ross }
84*b819cea2SGordon Ross 
85*b819cea2SGordon Ross void
86*b819cea2SGordon Ross thread_join(kt_did_t id)
87*b819cea2SGordon Ross {
88*b819cea2SGordon Ross 	thread_t thr_id;
89*b819cea2SGordon Ross 
90*b819cea2SGordon Ross 	thr_id = (thread_t)id;
91*b819cea2SGordon Ross 	(void) thr_join(thr_id, NULL, NULL);
92*b819cea2SGordon Ross }
93*b819cea2SGordon Ross 
94*b819cea2SGordon Ross void
95*b819cea2SGordon Ross tsignal(kthread_t *kt, int sig)
96*b819cea2SGordon Ross {
97*b819cea2SGordon Ross 	thread_t tid = (thread_t)(uintptr_t)kt;
98*b819cea2SGordon Ross 
99*b819cea2SGordon Ross 	(void) thr_kill(tid, sig);
100*b819cea2SGordon Ross }
101*b819cea2SGordon Ross 
102*b819cea2SGordon Ross 
103*b819cea2SGordon Ross /*ARGSUSED*/
104*b819cea2SGordon Ross kthread_t *
105*b819cea2SGordon Ross zthread_create(
106*b819cea2SGordon Ross     caddr_t stk,
107*b819cea2SGordon Ross     size_t stksize,
108*b819cea2SGordon Ross     void (*func)(),
109*b819cea2SGordon Ross     void *arg,
110*b819cea2SGordon Ross     size_t len,
111*b819cea2SGordon Ross     pri_t pri)
112*b819cea2SGordon Ross {
113*b819cea2SGordon Ross 	kthread_t *t;
114*b819cea2SGordon Ross 
115*b819cea2SGordon Ross 	t = thread_create(stk, stksize, func, arg, len, NULL, TS_RUN, pri);
116*b819cea2SGordon Ross 
117*b819cea2SGordon Ross 	return (t);
118*b819cea2SGordon Ross }
119*b819cea2SGordon Ross 
120*b819cea2SGordon Ross void
121*b819cea2SGordon Ross zthread_exit(void)
122*b819cea2SGordon Ross {
123*b819cea2SGordon Ross 	thread_exit();
124*b819cea2SGordon Ross 	/* NOTREACHED */
125*b819cea2SGordon Ross }
126