Lines Matching refs:wqp

62 workq_fini(workq_t *wqp)  in workq_fini()  argument
64 if (wqp == NULL) in workq_fini()
67 VERIFY(wqp->wq_working != B_TRUE); in workq_fini()
68 VERIFY0(mutex_destroy(&wqp->wq_lock)); in workq_fini()
69 VERIFY0(cond_destroy(&wqp->wq_cond)); in workq_fini()
70 if (wqp->wq_cap > 0) in workq_fini()
71 workq_free(wqp->wq_items, sizeof (void *) * wqp->wq_cap); in workq_fini()
72 if (wqp->wq_ndthreads > 0) in workq_fini()
73 workq_free(wqp->wq_thrs, sizeof (thread_t) * wqp->wq_ndthreads); in workq_fini()
74 workq_free(wqp, sizeof (workq_t)); in workq_fini()
81 workq_t *wqp; in workq_init() local
83 wqp = workq_alloc(sizeof (workq_t)); in workq_init()
84 if (wqp == NULL) in workq_init()
87 bzero(wqp, sizeof (workq_t)); in workq_init()
88 wqp->wq_items = workq_alloc(sizeof (void *) * WORKQ_DEFAULT_CAP); in workq_init()
89 if (wqp->wq_items == NULL) { in workq_init()
90 workq_free(wqp, sizeof (workq_t)); in workq_init()
93 bzero(wqp->wq_items, sizeof (void *) * WORKQ_DEFAULT_CAP); in workq_init()
95 wqp->wq_ndthreads = nthrs - 1; in workq_init()
96 if (wqp->wq_ndthreads > 0) { in workq_init()
97 wqp->wq_thrs = workq_alloc(sizeof (thread_t) * in workq_init()
98 wqp->wq_ndthreads); in workq_init()
99 if (wqp->wq_thrs == NULL) { in workq_init()
100 workq_free(wqp->wq_items, sizeof (void *) * in workq_init()
102 workq_free(wqp, sizeof (workq_t)); in workq_init()
107 if ((ret = mutex_init(&wqp->wq_lock, USYNC_THREAD | LOCK_ERRORCHECK, in workq_init()
109 if (wqp->wq_ndthreads > 0) { in workq_init()
110 workq_free(wqp->wq_thrs, in workq_init()
111 sizeof (thread_t) * wqp->wq_ndthreads); in workq_init()
113 workq_free(wqp->wq_items, sizeof (void *) * WORKQ_DEFAULT_CAP); in workq_init()
114 workq_free(wqp, sizeof (workq_t)); in workq_init()
118 if ((ret = cond_init(&wqp->wq_cond, USYNC_THREAD, NULL)) != 0) { in workq_init()
119 VERIFY0(mutex_destroy(&wqp->wq_lock)); in workq_init()
120 if (wqp->wq_ndthreads > 0) { in workq_init()
121 workq_free(wqp->wq_thrs, in workq_init()
122 sizeof (thread_t) * wqp->wq_ndthreads); in workq_init()
124 workq_free(wqp->wq_items, sizeof (void *) * WORKQ_DEFAULT_CAP); in workq_init()
125 workq_free(wqp, sizeof (workq_t)); in workq_init()
129 wqp->wq_cap = WORKQ_DEFAULT_CAP; in workq_init()
130 *outp = wqp; in workq_init()
135 workq_reset(workq_t *wqp) in workq_reset() argument
137 VERIFY(MUTEX_HELD(&wqp->wq_lock)); in workq_reset()
138 VERIFY(wqp->wq_working == B_FALSE); in workq_reset()
139 if (wqp->wq_cap > 0) in workq_reset()
140 bzero(wqp->wq_items, sizeof (void *) * wqp->wq_cap); in workq_reset()
141 wqp->wq_nitems = 0; in workq_reset()
142 wqp->wq_next = 0; in workq_reset()
143 wqp->wq_func = NULL; in workq_reset()
144 wqp->wq_arg = NULL; in workq_reset()
145 wqp->wq_iserror = B_FALSE; in workq_reset()
146 wqp->wq_error = 0; in workq_reset()
150 workq_grow(workq_t *wqp) in workq_grow() argument
155 VERIFY(MUTEX_HELD(&wqp->wq_lock)); in workq_grow()
156 VERIFY(wqp->wq_working == B_FALSE); in workq_grow()
158 if (SIZE_MAX - wqp->wq_cap < WORKQ_DEFAULT_CAP) in workq_grow()
161 ncap = wqp->wq_cap + WORKQ_DEFAULT_CAP; in workq_grow()
167 bcopy(wqp->wq_items, items, wqp->wq_cap * sizeof (void *)); in workq_grow()
168 workq_free(wqp->wq_items, sizeof (void *) * wqp->wq_cap); in workq_grow()
169 wqp->wq_items = items; in workq_grow()
170 wqp->wq_cap = ncap; in workq_grow()
175 workq_add(workq_t *wqp, void *item) in workq_add() argument
177 VERIFY0(mutex_lock(&wqp->wq_lock)); in workq_add()
178 if (wqp->wq_working == B_TRUE) { in workq_add()
179 VERIFY0(mutex_unlock(&wqp->wq_lock)); in workq_add()
183 if (wqp->wq_nitems == wqp->wq_cap) { in workq_add()
186 if ((ret = workq_grow(wqp)) != 0) { in workq_add()
187 VERIFY0(mutex_unlock(&wqp->wq_lock)); in workq_add()
192 wqp->wq_items[wqp->wq_nitems] = item; in workq_add()
193 wqp->wq_nitems++; in workq_add()
195 VERIFY0(mutex_unlock(&wqp->wq_lock)); in workq_add()
201 workq_pop(workq_t *wqp) in workq_pop() argument
205 VERIFY(MUTEX_HELD(&wqp->wq_lock)); in workq_pop()
206 VERIFY(wqp->wq_next < wqp->wq_nitems); in workq_pop()
208 out = wqp->wq_items[wqp->wq_next]; in workq_pop()
209 wqp->wq_items[wqp->wq_next] = NULL; in workq_pop()
210 wqp->wq_next++; in workq_pop()
218 workq_t *wqp = arg; in workq_thr_work() local
220 VERIFY0(mutex_lock(&wqp->wq_lock)); in workq_thr_work()
221 VERIFY(wqp->wq_working == B_TRUE); in workq_thr_work()
227 if (wqp->wq_iserror == B_TRUE || in workq_thr_work()
228 wqp->wq_next == wqp->wq_nitems) { in workq_thr_work()
229 VERIFY0(mutex_unlock(&wqp->wq_lock)); in workq_thr_work()
233 item = workq_pop(wqp); in workq_thr_work()
235 VERIFY0(mutex_unlock(&wqp->wq_lock)); in workq_thr_work()
236 ret = wqp->wq_func(item, wqp->wq_arg); in workq_thr_work()
237 VERIFY0(mutex_lock(&wqp->wq_lock)); in workq_thr_work()
240 if (wqp->wq_iserror == B_FALSE) { in workq_thr_work()
241 wqp->wq_iserror = B_TRUE; in workq_thr_work()
242 wqp->wq_error = ret; in workq_thr_work()
244 VERIFY0(mutex_unlock(&wqp->wq_lock)); in workq_thr_work()
251 workq_work(workq_t *wqp, workq_proc_f *func, void *arg, int *errp) in workq_work() argument
256 if (wqp == NULL || func == NULL) in workq_work()
259 VERIFY0(mutex_lock(&wqp->wq_lock)); in workq_work()
260 if (wqp->wq_working == B_TRUE) { in workq_work()
261 VERIFY0(mutex_unlock(&wqp->wq_lock)); in workq_work()
265 if (wqp->wq_nitems == 0) { in workq_work()
266 workq_reset(wqp); in workq_work()
267 VERIFY0(mutex_unlock(&wqp->wq_lock)); in workq_work()
271 wqp->wq_func = func; in workq_work()
272 wqp->wq_arg = arg; in workq_work()
273 wqp->wq_next = 0; in workq_work()
274 wqp->wq_working = B_TRUE; in workq_work()
277 for (i = 0; i < wqp->wq_ndthreads; i++) { in workq_work()
278 ret = thr_create(NULL, 0, workq_thr_work, wqp, 0, in workq_work()
279 &wqp->wq_thrs[i]); in workq_work()
281 wqp->wq_iserror = B_TRUE; in workq_work()
285 VERIFY0(mutex_unlock(&wqp->wq_lock)); in workq_work()
287 (void) workq_thr_work(wqp); in workq_work()
289 for (i = 0; i < wqp->wq_ndthreads; i++) { in workq_work()
290 VERIFY0(thr_join(wqp->wq_thrs[i], NULL, NULL)); in workq_work()
293 VERIFY0(mutex_lock(&wqp->wq_lock)); in workq_work()
294 wqp->wq_working = B_FALSE; in workq_work()
295 if (ret == 0 && wqp->wq_iserror == B_TRUE) { in workq_work()
298 *errp = wqp->wq_error; in workq_work()
300 VERIFY(wqp->wq_iserror == B_FALSE); in workq_work()
304 workq_reset(wqp); in workq_work()
305 VERIFY0(mutex_unlock(&wqp->wq_lock)); in workq_work()