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