usr/src/lib/libc/inc/thread_pool.h
38
typedef struct tpool tpool_t; /* opaque thread pool descriptor */
usr/src/lib/libc/inc/thread_pool.h
44
extern int tpool_dispatch(tpool_t *tpool,
usr/src/lib/libc/inc/thread_pool.h
46
extern void tpool_destroy(tpool_t *tpool);
usr/src/lib/libc/inc/thread_pool.h
47
extern void tpool_abandon(tpool_t *tpool);
usr/src/lib/libc/inc/thread_pool.h
48
extern void tpool_wait(tpool_t *tpool);
usr/src/lib/libc/inc/thread_pool.h
49
extern void tpool_suspend(tpool_t *tpool);
usr/src/lib/libc/inc/thread_pool.h
50
extern int tpool_suspended(tpool_t *tpool);
usr/src/lib/libc/inc/thread_pool.h
51
extern void tpool_resume(tpool_t *tpool);
usr/src/lib/libc/inc/thread_pool.h
52
extern int tpool_member(tpool_t *tpool);
usr/src/lib/libc/port/rt/sigev_thread.c
126
tpool_t *tpool = tcdp->tcd_poolp;
usr/src/lib/libc/port/rt/sigev_thread.c
129
if (tpool == NULL)
usr/src/lib/libc/port/rt/sigev_thread.c
135
if (tpool_dispatch(tpool, notifier, stdp) != 0) {
usr/src/lib/libc/port/tpool/thread_pool.c
103
job_cleanup(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
109
sig_mutex_lock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
111
for (activepp = &tpool->tp_active;; activepp = &activep->tpa_next) {
usr/src/lib/libc/port/tpool/thread_pool.c
118
if (tpool->tp_flags & TP_WAIT)
usr/src/lib/libc/port/tpool/thread_pool.c
119
notify_waiters(tpool);
usr/src/lib/libc/port/tpool/thread_pool.c
125
tpool_t *tpool = (tpool_t *)arg;
usr/src/lib/libc/port/tpool/thread_pool.c
131
sig_mutex_lock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
132
pthread_cleanup_push(worker_cleanup, tpool);
usr/src/lib/libc/port/tpool/thread_pool.c
141
tpool->tp_idle++;
usr/src/lib/libc/port/tpool/thread_pool.c
142
if (tpool->tp_flags & TP_WAIT)
usr/src/lib/libc/port/tpool/thread_pool.c
143
notify_waiters(tpool);
usr/src/lib/libc/port/tpool/thread_pool.c
144
while ((tpool->tp_head == NULL ||
usr/src/lib/libc/port/tpool/thread_pool.c
145
(tpool->tp_flags & TP_SUSPEND)) &&
usr/src/lib/libc/port/tpool/thread_pool.c
146
!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))) {
usr/src/lib/libc/port/tpool/thread_pool.c
147
if (tpool->tp_current <= tpool->tp_minimum ||
usr/src/lib/libc/port/tpool/thread_pool.c
148
tpool->tp_linger == 0) {
usr/src/lib/libc/port/tpool/thread_pool.c
149
(void) sig_cond_wait(&tpool->tp_workcv,
usr/src/lib/libc/port/tpool/thread_pool.c
150
&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
154
timeout.tv_sec = tpool->tp_linger;
usr/src/lib/libc/port/tpool/thread_pool.c
156
if (sig_cond_reltimedwait(&tpool->tp_workcv,
usr/src/lib/libc/port/tpool/thread_pool.c
157
&tpool->tp_mutex, &timeout) != 0) {
usr/src/lib/libc/port/tpool/thread_pool.c
163
tpool->tp_idle--;
usr/src/lib/libc/port/tpool/thread_pool.c
164
if (tpool->tp_flags & TP_DESTROY)
usr/src/lib/libc/port/tpool/thread_pool.c
166
if (tpool->tp_flags & TP_ABANDON) {
usr/src/lib/libc/port/tpool/thread_pool.c
168
if (tpool->tp_flags & TP_SUSPEND) {
usr/src/lib/libc/port/tpool/thread_pool.c
169
tpool->tp_flags &= ~TP_SUSPEND;
usr/src/lib/libc/port/tpool/thread_pool.c
170
(void) cond_broadcast(&tpool->tp_workcv);
usr/src/lib/libc/port/tpool/thread_pool.c
172
if (tpool->tp_head == NULL)
usr/src/lib/libc/port/tpool/thread_pool.c
175
if ((job = tpool->tp_head) != NULL &&
usr/src/lib/libc/port/tpool/thread_pool.c
176
!(tpool->tp_flags & TP_SUSPEND)) {
usr/src/lib/libc/port/tpool/thread_pool.c
180
tpool->tp_head = job->tpj_next;
usr/src/lib/libc/port/tpool/thread_pool.c
181
if (job == tpool->tp_tail)
usr/src/lib/libc/port/tpool/thread_pool.c
182
tpool->tp_tail = NULL;
usr/src/lib/libc/port/tpool/thread_pool.c
183
tpool->tp_njobs--;
usr/src/lib/libc/port/tpool/thread_pool.c
184
active.tpa_next = tpool->tp_active;
usr/src/lib/libc/port/tpool/thread_pool.c
185
tpool->tp_active = &active;
usr/src/lib/libc/port/tpool/thread_pool.c
186
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
187
pthread_cleanup_push(job_cleanup, tpool);
usr/src/lib/libc/port/tpool/thread_pool.c
205
if (elapsed && tpool->tp_current > tpool->tp_minimum) {
usr/src/lib/libc/port/tpool/thread_pool.c
222
create_worker(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
228
error = pthread_create(NULL, &tpool->tp_attr, tpool_worker, tpool);
usr/src/lib/libc/port/tpool/thread_pool.c
237
tpool_t *tpool;
usr/src/lib/libc/port/tpool/thread_pool.c
268
tpool = lmalloc(sizeof (*tpool));
usr/src/lib/libc/port/tpool/thread_pool.c
269
if (tpool == NULL) {
usr/src/lib/libc/port/tpool/thread_pool.c
273
(void) mutex_init(&tpool->tp_mutex, USYNC_THREAD, NULL);
usr/src/lib/libc/port/tpool/thread_pool.c
274
(void) cond_init(&tpool->tp_busycv, USYNC_THREAD, NULL);
usr/src/lib/libc/port/tpool/thread_pool.c
275
(void) cond_init(&tpool->tp_workcv, USYNC_THREAD, NULL);
usr/src/lib/libc/port/tpool/thread_pool.c
276
(void) cond_init(&tpool->tp_waitcv, USYNC_THREAD, NULL);
usr/src/lib/libc/port/tpool/thread_pool.c
277
tpool->tp_minimum = min_threads;
usr/src/lib/libc/port/tpool/thread_pool.c
278
tpool->tp_maximum = max_threads;
usr/src/lib/libc/port/tpool/thread_pool.c
279
tpool->tp_linger = linger;
usr/src/lib/libc/port/tpool/thread_pool.c
288
error = pthread_attr_clone(&tpool->tp_attr, attr);
usr/src/lib/libc/port/tpool/thread_pool.c
290
lfree(tpool, sizeof (*tpool));
usr/src/lib/libc/port/tpool/thread_pool.c
296
(void) pthread_attr_setdetachstate(&tpool->tp_attr,
usr/src/lib/libc/port/tpool/thread_pool.c
298
(void) pthread_attr_setdaemonstate_np(&tpool->tp_attr,
usr/src/lib/libc/port/tpool/thread_pool.c
304
tpool->tp_forw = tpool;
usr/src/lib/libc/port/tpool/thread_pool.c
305
tpool->tp_back = tpool;
usr/src/lib/libc/port/tpool/thread_pool.c
306
thread_pools = tpool;
usr/src/lib/libc/port/tpool/thread_pool.c
308
thread_pools->tp_back->tp_forw = tpool;
usr/src/lib/libc/port/tpool/thread_pool.c
309
tpool->tp_forw = thread_pools;
usr/src/lib/libc/port/tpool/thread_pool.c
310
tpool->tp_back = thread_pools->tp_back;
usr/src/lib/libc/port/tpool/thread_pool.c
311
thread_pools->tp_back = tpool;
usr/src/lib/libc/port/tpool/thread_pool.c
315
return (tpool);
usr/src/lib/libc/port/tpool/thread_pool.c
326
tpool_dispatch(tpool_t *tpool, void (*func)(void *), void *arg)
usr/src/lib/libc/port/tpool/thread_pool.c
330
ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON)));
usr/src/lib/libc/port/tpool/thread_pool.c
338
sig_mutex_lock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
340
if (tpool->tp_head == NULL)
usr/src/lib/libc/port/tpool/thread_pool.c
341
tpool->tp_head = job;
usr/src/lib/libc/port/tpool/thread_pool.c
343
tpool->tp_tail->tpj_next = job;
usr/src/lib/libc/port/tpool/thread_pool.c
344
tpool->tp_tail = job;
usr/src/lib/libc/port/tpool/thread_pool.c
345
tpool->tp_njobs++;
usr/src/lib/libc/port/tpool/thread_pool.c
347
if (!(tpool->tp_flags & TP_SUSPEND)) {
usr/src/lib/libc/port/tpool/thread_pool.c
348
if (tpool->tp_idle > 0)
usr/src/lib/libc/port/tpool/thread_pool.c
349
(void) cond_signal(&tpool->tp_workcv);
usr/src/lib/libc/port/tpool/thread_pool.c
350
else if (tpool->tp_current < tpool->tp_maximum &&
usr/src/lib/libc/port/tpool/thread_pool.c
351
create_worker(tpool) == 0)
usr/src/lib/libc/port/tpool/thread_pool.c
352
tpool->tp_current++;
usr/src/lib/libc/port/tpool/thread_pool.c
355
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
365
tpool_destroy(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
369
ASSERT(!tpool_member(tpool));
usr/src/lib/libc/port/tpool/thread_pool.c
370
ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON)));
usr/src/lib/libc/port/tpool/thread_pool.c
372
sig_mutex_lock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
373
pthread_cleanup_push(sig_mutex_unlock, &tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
376
tpool->tp_flags |= TP_DESTROY;
usr/src/lib/libc/port/tpool/thread_pool.c
377
tpool->tp_flags &= ~TP_SUSPEND;
usr/src/lib/libc/port/tpool/thread_pool.c
378
(void) cond_broadcast(&tpool->tp_workcv);
usr/src/lib/libc/port/tpool/thread_pool.c
38
delete_pool(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
381
for (activep = tpool->tp_active; activep; activep = activep->tpa_next)
usr/src/lib/libc/port/tpool/thread_pool.c
385
while (tpool->tp_active != NULL) {
usr/src/lib/libc/port/tpool/thread_pool.c
386
tpool->tp_flags |= TP_WAIT;
usr/src/lib/libc/port/tpool/thread_pool.c
387
(void) sig_cond_wait(&tpool->tp_waitcv, &tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
391
while (tpool->tp_current != 0)
usr/src/lib/libc/port/tpool/thread_pool.c
392
(void) sig_cond_wait(&tpool->tp_busycv, &tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
395
delete_pool(tpool);
usr/src/lib/libc/port/tpool/thread_pool.c
403
tpool_abandon(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
405
ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON)));
usr/src/lib/libc/port/tpool/thread_pool.c
407
sig_mutex_lock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
408
if (tpool->tp_current == 0) {
usr/src/lib/libc/port/tpool/thread_pool.c
410
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
411
delete_pool(tpool);
usr/src/lib/libc/port/tpool/thread_pool.c
414
tpool->tp_flags |= TP_ABANDON;
usr/src/lib/libc/port/tpool/thread_pool.c
415
tpool->tp_flags &= ~TP_SUSPEND;
usr/src/lib/libc/port/tpool/thread_pool.c
416
(void) cond_broadcast(&tpool->tp_workcv);
usr/src/lib/libc/port/tpool/thread_pool.c
417
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
42
ASSERT(tpool->tp_current == 0 && tpool->tp_active == NULL);
usr/src/lib/libc/port/tpool/thread_pool.c
426
tpool_wait(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
428
ASSERT(!tpool_member(tpool));
usr/src/lib/libc/port/tpool/thread_pool.c
429
ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON)));
usr/src/lib/libc/port/tpool/thread_pool.c
431
sig_mutex_lock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
432
pthread_cleanup_push(sig_mutex_unlock, &tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
433
while (tpool->tp_head != NULL || tpool->tp_active != NULL) {
usr/src/lib/libc/port/tpool/thread_pool.c
434
tpool->tp_flags |= TP_WAIT;
usr/src/lib/libc/port/tpool/thread_pool.c
435
(void) sig_cond_wait(&tpool->tp_waitcv, &tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
436
ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON)));
usr/src/lib/libc/port/tpool/thread_pool.c
442
tpool_suspend(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
444
ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON)));
usr/src/lib/libc/port/tpool/thread_pool.c
446
sig_mutex_lock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
447
tpool->tp_flags |= TP_SUSPEND;
usr/src/lib/libc/port/tpool/thread_pool.c
448
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
452
tpool_suspended(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
456
ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON)));
usr/src/lib/libc/port/tpool/thread_pool.c
458
sig_mutex_lock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
459
suspended = (tpool->tp_flags & TP_SUSPEND) != 0;
usr/src/lib/libc/port/tpool/thread_pool.c
460
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
466
tpool_resume(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
470
ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON)));
usr/src/lib/libc/port/tpool/thread_pool.c
472
sig_mutex_lock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
473
if (!(tpool->tp_flags & TP_SUSPEND)) {
usr/src/lib/libc/port/tpool/thread_pool.c
474
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
477
tpool->tp_flags &= ~TP_SUSPEND;
usr/src/lib/libc/port/tpool/thread_pool.c
478
(void) cond_broadcast(&tpool->tp_workcv);
usr/src/lib/libc/port/tpool/thread_pool.c
479
excess = tpool->tp_njobs - tpool->tp_idle;
usr/src/lib/libc/port/tpool/thread_pool.c
48
if (thread_pools == tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
480
while (excess-- > 0 && tpool->tp_current < tpool->tp_maximum) {
usr/src/lib/libc/port/tpool/thread_pool.c
481
if (create_worker(tpool) != 0)
usr/src/lib/libc/port/tpool/thread_pool.c
483
tpool->tp_current++;
usr/src/lib/libc/port/tpool/thread_pool.c
485
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
489
tpool_member(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
49
thread_pools = tpool->tp_forw;
usr/src/lib/libc/port/tpool/thread_pool.c
494
ASSERT(!(tpool->tp_flags & (TP_DESTROY | TP_ABANDON)));
usr/src/lib/libc/port/tpool/thread_pool.c
496
sig_mutex_lock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
497
for (activep = tpool->tp_active; activep; activep = activep->tpa_next) {
usr/src/lib/libc/port/tpool/thread_pool.c
499
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
50
if (thread_pools == tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
503
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
511
tpool_t *tpool;
usr/src/lib/libc/port/tpool/thread_pool.c
521
if ((tpool = thread_pools) == NULL)
usr/src/lib/libc/port/tpool/thread_pool.c
527
(void) mutex_init(&tpool->tp_mutex, USYNC_THREAD, NULL);
usr/src/lib/libc/port/tpool/thread_pool.c
528
(void) cond_init(&tpool->tp_busycv, USYNC_THREAD, NULL);
usr/src/lib/libc/port/tpool/thread_pool.c
529
(void) cond_init(&tpool->tp_workcv, USYNC_THREAD, NULL);
usr/src/lib/libc/port/tpool/thread_pool.c
53
tpool->tp_back->tp_forw = tpool->tp_forw;
usr/src/lib/libc/port/tpool/thread_pool.c
530
(void) cond_init(&tpool->tp_waitcv, USYNC_THREAD, NULL);
usr/src/lib/libc/port/tpool/thread_pool.c
531
for (job = tpool->tp_head; job; job = tpool->tp_head) {
usr/src/lib/libc/port/tpool/thread_pool.c
532
tpool->tp_head = job->tpj_next;
usr/src/lib/libc/port/tpool/thread_pool.c
535
tpool->tp_tail = NULL;
usr/src/lib/libc/port/tpool/thread_pool.c
536
tpool->tp_njobs = 0;
usr/src/lib/libc/port/tpool/thread_pool.c
537
for (activep = tpool->tp_active; activep;
usr/src/lib/libc/port/tpool/thread_pool.c
54
tpool->tp_forw->tp_back = tpool->tp_back;
usr/src/lib/libc/port/tpool/thread_pool.c
544
tpool->tp_idle = 0;
usr/src/lib/libc/port/tpool/thread_pool.c
545
tpool->tp_current = 0;
usr/src/lib/libc/port/tpool/thread_pool.c
546
if ((tpool->tp_active = activep) != NULL)
usr/src/lib/libc/port/tpool/thread_pool.c
547
tpool->tp_current = 1;
usr/src/lib/libc/port/tpool/thread_pool.c
548
tpool->tp_flags &= ~TP_WAIT;
usr/src/lib/libc/port/tpool/thread_pool.c
549
if (tpool->tp_flags & (TP_DESTROY | TP_ABANDON)) {
usr/src/lib/libc/port/tpool/thread_pool.c
550
tpool->tp_flags &= ~TP_DESTROY;
usr/src/lib/libc/port/tpool/thread_pool.c
551
tpool->tp_flags |= TP_ABANDON;
usr/src/lib/libc/port/tpool/thread_pool.c
552
if (tpool->tp_current == 0) {
usr/src/lib/libc/port/tpool/thread_pool.c
553
delete_pool(tpool);
usr/src/lib/libc/port/tpool/thread_pool.c
557
} while ((tpool = tpool->tp_forw) != thread_pools);
usr/src/lib/libc/port/tpool/thread_pool.c
61
for (job = tpool->tp_head; job != NULL; job = tpool->tp_head) {
usr/src/lib/libc/port/tpool/thread_pool.c
62
tpool->tp_head = job->tpj_next;
usr/src/lib/libc/port/tpool/thread_pool.c
65
(void) pthread_attr_destroy(&tpool->tp_attr);
usr/src/lib/libc/port/tpool/thread_pool.c
66
lfree(tpool, sizeof (*tpool));
usr/src/lib/libc/port/tpool/thread_pool.c
73
worker_cleanup(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
75
ASSERT(MUTEX_HELD(&tpool->tp_mutex));
usr/src/lib/libc/port/tpool/thread_pool.c
77
if (--tpool->tp_current == 0 &&
usr/src/lib/libc/port/tpool/thread_pool.c
78
(tpool->tp_flags & (TP_DESTROY | TP_ABANDON))) {
usr/src/lib/libc/port/tpool/thread_pool.c
79
if (tpool->tp_flags & TP_ABANDON) {
usr/src/lib/libc/port/tpool/thread_pool.c
80
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
81
delete_pool(tpool);
usr/src/lib/libc/port/tpool/thread_pool.c
84
if (tpool->tp_flags & TP_DESTROY)
usr/src/lib/libc/port/tpool/thread_pool.c
85
(void) cond_broadcast(&tpool->tp_busycv);
usr/src/lib/libc/port/tpool/thread_pool.c
87
sig_mutex_unlock(&tpool->tp_mutex);
usr/src/lib/libc/port/tpool/thread_pool.c
91
notify_waiters(tpool_t *tpool)
usr/src/lib/libc/port/tpool/thread_pool.c
93
if (tpool->tp_head == NULL && tpool->tp_active == NULL) {
usr/src/lib/libc/port/tpool/thread_pool.c
94
tpool->tp_flags &= ~TP_WAIT;
usr/src/lib/libc/port/tpool/thread_pool.c
95
(void) cond_broadcast(&tpool->tp_waitcv);