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 *
_curthread(void)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 *
thread_create(caddr_t stk,size_t stksize,void (* func)(),void * arg,size_t len,struct proc * pp,int state,pri_t pri)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
thread_exit(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
thread_join(kt_did_t id)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
tsignal(kthread_t * kt,int sig)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 *
zthread_create(caddr_t stk,size_t stksize,void (* func)(),void * arg,size_t len,pri_t pri)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
zthread_exit(void)121*b819cea2SGordon Ross zthread_exit(void)
122*b819cea2SGordon Ross {
123*b819cea2SGordon Ross thread_exit();
124*b819cea2SGordon Ross /* NOTREACHED */
125*b819cea2SGordon Ross }
126