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 *))(uintptr_t)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