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 * 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 * 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 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 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 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 * 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 121*b819cea2SGordon Ross zthread_exit(void) 122*b819cea2SGordon Ross { 123*b819cea2SGordon Ross thread_exit(); 124*b819cea2SGordon Ross /* NOTREACHED */ 125*b819cea2SGordon Ross } 126