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 * 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 * 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 80 thread_exit(void) 81 { 82 thr_exit(NULL); 83 } 84 85 void 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 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 * 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 121 zthread_exit(void) 122 { 123 thread_exit(); 124 /* NOTREACHED */ 125 }