1 /* 2 * CDDL HEADER START 3 * 4 * The contents of this file are subject to the terms of the 5 * Common Development and Distribution License (the "License"). 6 * You may not use this file except in compliance with the License. 7 * 8 * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE 9 * or http://www.opensolaris.org/os/licensing. 10 * See the License for the specific language governing permissions 11 * and limitations under the License. 12 * 13 * When distributing Covered Code, include this CDDL HEADER in each 14 * file and include the License file at usr/src/OPENSOLARIS.LICENSE. 15 * If applicable, add the following below this CDDL HEADER, with the 16 * fields enclosed by brackets "[]" replaced with your own identifying 17 * information: Portions Copyright [yyyy] [name of copyright owner] 18 * 19 * CDDL HEADER END 20 */ 21 /* 22 * Copyright 2008 Sun Microsystems, Inc. All rights reserved. 23 * Use is subject to license terms. 24 */ 25 26 #ifndef _NSC_THREAD_H 27 #define _NSC_THREAD_H 28 29 #ifdef __cplusplus 30 extern "C" { 31 #endif 32 33 #ifdef _KERNEL 34 35 #include <sys/ksynch.h> /* for kmutex_t and kcondvar_t */ 36 37 /* 38 * A simple way to marshal kthreads into sets for use by nsctl / nskern 39 * clients. The ns threads are created in user land by nskernd, and 40 * then call into the nskern kernel module for allocation into sets. 41 */ 42 43 struct nsthread; 44 struct nstset; 45 46 #ifndef _BLIND_T 47 #define _BLIND_T 48 typedef void * blind_t; 49 #endif /* _BLIND_T */ 50 51 52 /* 53 * Queue stuff that should really be in the DDI. 54 */ 55 56 typedef struct nst_q { 57 struct nst_q *q_forw; 58 struct nst_q *q_back; 59 } nst_q_t; 60 61 62 /* 63 * Per thread data structure. 64 */ 65 66 typedef struct nsthread { 67 nst_q_t tp_link; /* Doubly linked free list */ 68 69 struct nstset *tp_set; /* Set to which thread belongs */ 70 struct nsthread *tp_chain; /* Link in chain of threads in set */ 71 72 kcondvar_t tp_cv; /* Suspend/resume synchronisation */ 73 74 /* 75 * Everything past this point is cleared when the thread is 76 * initialised for (re)use. 77 */ 78 79 int tp_flag; /* State (below) */ 80 81 void (*tp_func)(); /* First function */ 82 blind_t tp_arg; /* Argument to tp_func */ 83 } nsthread_t; 84 85 /* 86 * Flags for nst_init 87 */ 88 #define NST_CREATE 0x1 /* Create resources to run thread */ 89 #define NST_SLEEP 0x2 /* Wait for resources to be available */ 90 91 /* 92 * Thread state flags 93 */ 94 #define NST_TF_INUSE 0x1 /* Thread currently in use */ 95 #define NST_TF_ACTIVE 0x2 /* Thread is being manipulated */ 96 #define NST_TF_PENDING 0x4 /* Thread is pending a create */ 97 #define NST_TF_DESTROY 0x8 /* Destroy thread when finished */ 98 #define NST_TF_KILL 0x10 /* Thread is being killed */ 99 100 /* 101 * Thread set. 102 */ 103 typedef struct nstset { 104 struct nstset *set_next; /* Next set in list of sets */ 105 106 nsthread_t *set_chain; /* Chain of all threads in set */ 107 nst_q_t set_reuse; /* Chain of reusable threads */ 108 nst_q_t set_free; /* Chain of free threads */ 109 110 char set_name[32]; /* Name associated with set */ 111 112 ushort_t set_nlive; /* No. of active threads */ 113 ushort_t set_nthread; /* No. of threads in set */ 114 int set_flag; /* State (below) */ 115 int set_pending; /* Operation is pending */ 116 117 kmutex_t set_lock; /* Mutex for chains and counts */ 118 kcondvar_t set_kill_cv; /* Kill synchronisation */ 119 kcondvar_t set_destroy_cv; /* Shutdown synchronisation */ 120 volatile int set_destroy_cnt; /* No. of waiters */ 121 122 kcondvar_t set_res_cv; /* Resource alloc synchronisation */ 123 int set_res_cnt; /* No. of waiters */ 124 } nstset_t; 125 126 /* 127 * Set state flags 128 */ 129 #define NST_SF_KILL 1 /* Set is being killed */ 130 131 /* 132 * General defines 133 */ 134 #define NST_KILL_TIMEOUT 100000 /* usec to wait for threads to die */ 135 #define NST_MEMORY_TIMEOUT 500000 /* usec to wait for memory */ 136 137 /* 138 * Function prototypes 139 */ 140 141 int nst_add_thread(nstset_t *, int); 142 nsthread_t *nst_create(nstset_t *, void (*)(), blind_t, int); 143 int nst_del_thread(nstset_t *, int); 144 void nst_destroy(nstset_t *); 145 nstset_t *nst_init(char *, int); 146 int nst_nlive(nstset_t *); 147 int nst_nthread(nstset_t *); 148 int nst_startup(void); 149 void nst_shutdown(void); 150 151 #endif /* _KERNEL */ 152 153 #ifdef __cplusplus 154 } 155 #endif 156 157 #endif /* _NSC_THREAD_H */