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