Lines Matching refs:s
152 serializer_exec(serializer_t *s, srproc_t proc, mblk_t *mp, void *arg)
154 ASSERT(MUTEX_NOT_HELD(&s->ser_lock));
155 ASSERT(s->ser_owner == curthread);
160 s->ser_curr = mp;
161 s->ser_arg = arg;
162 s->ser_proc = proc;
170 serializer_enqueue(serializer_t *s, srproc_t proc, mblk_t *mp, void *arg)
172 ASSERT(MUTEX_HELD(&s->ser_lock));
174 DTRACE_PROBE4(serializer__enqueue, serializer_t *, s,
176 s->ser_count++;
179 if (s->ser_last != NULL)
180 s->ser_last->b_next = mp;
182 s->ser_first = mp;
183 s->ser_last = mp;
190 serializer_drain(serializer_t *s, int credit)
192 mblk_t *mp = s->ser_first;
194 ASSERT(MUTEX_HELD(&s->ser_lock));
195 ASSERT(s->ser_owner == curthread);
197 for (; mp != NULL && credit-- != 0; mp = s->ser_first) {
201 if ((s->ser_first = s->ser_first->b_next) == NULL) {
202 s->ser_last = NULL;
206 ASSERT(s->ser_count != 0);
207 s->ser_count--;
210 mutex_exit(&s->ser_lock);
212 DTRACE_PROBE4(serializer__exec__start, serializer_t *, s,
214 serializer_exec(s, proc, mp, arg);
215 DTRACE_PROBE4(serializer__exec__end, serializer_t *, s,
218 mutex_enter(&s->ser_lock);
226 serializer_drain_completely(serializer_t *s)
228 mutex_enter(&s->ser_lock);
229 ASSERT(s->ser_taskq);
230 if (s->ser_owner == NULL) {
231 s->ser_owner = curthread;
232 while (s->ser_first != NULL)
233 serializer_drain(s, INT_MAX);
234 s->ser_owner = NULL;
235 s->ser_curr = NULL;
236 s->ser_proc = NULL;
237 s->ser_arg = NULL;
239 s->ser_taskq = B_FALSE;
243 cv_signal(&s->ser_cv);
244 mutex_exit(&s->ser_lock);
254 serializer_enter(serializer_t *s, srproc_t proc, mblk_t *mp, void *arg)
261 ASSERT(MUTEX_NOT_HELD(&s->ser_lock));
263 mutex_enter(&s->ser_lock);
264 if (s->ser_owner != NULL) {
268 serializer_enqueue(s, proc, mp, arg);
276 s->ser_owner = curthread;
278 if (s->ser_first != NULL) {
279 ASSERT(s->ser_count != 0);
280 serializer_enqueue(s, proc, mp, arg);
282 ASSERT(s->ser_count == 0);
283 mutex_exit(&s->ser_lock);
288 serializer_t *, s, mblk_t *, mp,
290 serializer_exec(s, proc, mp, arg);
292 serializer_t *, s, mblk_t *, mp,
294 mutex_enter(&s->ser_lock);
302 while ((s->ser_first != NULL) && (tid == 0)) {
303 serializer_drain(s, serializer_credit);
304 if (s->ser_first != NULL) {
310 if (s->ser_taskq) {
316 s, TQ_NOSLEEP | TQ_NOQUEUE);
318 s->ser_taskq = B_TRUE;
322 s->ser_owner = NULL;
323 s->ser_curr = NULL;
324 s->ser_proc = NULL;
325 s->ser_arg = NULL;
330 cv_signal(&s->ser_cv);
331 mutex_exit(&s->ser_lock);
339 serializer_wait(serializer_t *s)
341 mutex_enter(&s->ser_lock);
343 ASSERT(s->ser_owner != curthread);
345 while ((s->ser_owner != NULL) || s->ser_taskq || (s->ser_first != NULL))
346 cv_wait(&s->ser_cv, &s->ser_lock);
347 ASSERT((s->ser_first == NULL) && (s->ser_last == NULL));
351 cv_signal(&s->ser_cv);
352 mutex_exit(&s->ser_lock);
368 serializer_destroy(serializer_t *s)
370 serializer_wait(s);
372 ASSERT(s->ser_owner == NULL);
373 ASSERT(s->ser_taskq == 0);
374 ASSERT(s->ser_count == 0);
375 ASSERT(s->ser_first == NULL);
376 ASSERT(s->ser_last == NULL);
378 kmem_cache_free(serializer_cache, s);
385 serializer_t *s = buf;
387 mutex_init(&s->ser_lock, NULL, MUTEX_DEFAULT, NULL);
388 cv_init(&s->ser_cv, NULL, CV_DEFAULT, NULL);
390 s->ser_taskq = 0;
391 s->ser_count = 0;
392 s->ser_first = s->ser_last = s->ser_curr = NULL;
393 s->ser_proc = NULL;
394 s->ser_arg = NULL;
395 s->ser_owner = NULL;
403 serializer_t *s = buf;
405 mutex_destroy(&s->ser_lock);
406 cv_destroy(&s->ser_cv);