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  * Copyright 2017 RackTop Systems.
15  */
16 
17 #include <sys/cmn_err.h>
18 #include <sys/thread.h>
19 #include <sys/zone.h>
20 #include <sys/proc.h>
21 
22 #define	_SYNCH_H	/* keep out <synch.h> */
23 #include <thread.h>
24 
25 /*
26  * Get the current kthread_t pointer.
27  */
28 kthread_t *
29 _curthread(void)
30 {
31 	thread_t tid;
32 
33 	tid = thr_self();
34 	return ((kthread_t *)(uintptr_t)tid);
35 }
36 
37 /*
38  * Create a thread.
39  *
40  * thread_create() blocks for memory if necessary.  It never fails.
41  */
42 /* ARGSUSED */
43 kthread_t *
44 thread_create(
45 	caddr_t	stk,
46 	size_t	stksize,
47 	void	(*func)(),
48 	void	*arg,
49 	size_t	len,
50 	struct proc *pp,
51 	int	state,
52 	pri_t	pri)
53 {
54 	void * (*thr_func)(void *);
55 	thread_t newtid;
56 	int thr_flags = 0;
57 	int rc;
58 
59 	thr_flags = THR_BOUND;
60 
61 	switch (state) {
62 	case TS_RUN:
63 	case TS_ONPROC:
64 		break;
65 	case TS_STOPPED:
66 		thr_flags |= THR_SUSPENDED;
67 		break;
68 	default:
69 		cmn_err(CE_PANIC, "thread_create: invalid state");
70 		break;
71 	}
72 
73 	thr_func = (void *(*)(void *))func;
74 	rc = thr_create(NULL, 0, thr_func, arg, thr_flags, &newtid);
75 	if (rc != 0)
76 		cmn_err(CE_PANIC, "thread_create failed, rc=%d", rc);
77 
78 	return ((void *)(uintptr_t)newtid);
79 }
80 
81 void
82 thread_exit(void)
83 {
84 	thr_exit(NULL);
85 }
86 
87 void
88 thread_join(kt_did_t id)
89 {
90 	thread_t thr_id;
91 
92 	thr_id = (thread_t)id;
93 	(void) thr_join(thr_id, NULL, NULL);
94 }
95 
96 void
97 tsignal(kthread_t *kt, int sig)
98 {
99 	thread_t tid = (thread_t)(uintptr_t)kt;
100 
101 	(void) thr_kill(tid, sig);
102 }
103 
104 
105 /*ARGSUSED*/
106 kthread_t *
107 zthread_create(
108     caddr_t stk,
109     size_t stksize,
110     void (*func)(),
111     void *arg,
112     size_t len,
113     pri_t pri)
114 {
115 	kthread_t *t;
116 
117 	t = thread_create(stk, stksize, func, arg, len, NULL, TS_RUN, pri);
118 
119 	return (t);
120 }
121 
122 void
123 zthread_exit(void)
124 {
125 	thread_exit();
126 	/* NOTREACHED */
127 }
128 
129 void
130 tsd_create(uint_t *keyp, void (*destructor)(void *))
131 {
132 	VERIFY0(thr_keycreate(keyp, destructor));
133 }
134 
135 /*ARGSUSED*/
136 void
137 tsd_destroy(uint_t *keyp)
138 {}
139 
140 void *
141 tsd_get(uint_t key)
142 {
143 	void *value;
144 
145 	return (thr_getspecific(key, &value) ? NULL : value);
146 }
147 
148 int
149 tsd_set(uint_t key, void *value)
150 {
151 	return (thr_setspecific(key, value));
152 }
153