]>
Commit | Line | Data |
---|---|---|
46364cb2 BB |
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 | /* | |
23 | * Copyright 2008 Sun Microsystems, Inc. All rights reserved. | |
24 | * Use is subject to license terms. | |
25 | */ | |
26 | ||
27 | #ifndef _THREAD_POOL_IMPL_H | |
28 | #define _THREAD_POOL_IMPL_H | |
29 | ||
30 | #include <thread_pool.h> | |
31 | ||
32 | #ifdef __cplusplus | |
33 | extern "C" { | |
34 | #endif | |
35 | ||
36 | /* | |
37 | * Thread pool implementation definitions. | |
38 | * See <thread_pool.h> for interface declarations. | |
39 | */ | |
40 | ||
41 | /* | |
42 | * FIFO queued job | |
43 | */ | |
44 | typedef struct tpool_job tpool_job_t; | |
45 | struct tpool_job { | |
46 | tpool_job_t *tpj_next; /* list of jobs */ | |
47 | void (*tpj_func)(void *); /* function to call */ | |
48 | void *tpj_arg; /* its argument */ | |
49 | }; | |
50 | ||
51 | /* | |
52 | * List of active threads, linked through their stacks. | |
53 | */ | |
54 | typedef struct tpool_active tpool_active_t; | |
55 | struct tpool_active { | |
56 | tpool_active_t *tpa_next; /* list of active threads */ | |
57 | pthread_t tpa_tid; /* active thread id */ | |
58 | }; | |
59 | ||
60 | /* | |
61 | * The thread pool. | |
62 | */ | |
63 | struct tpool { | |
64 | tpool_t *tp_forw; /* circular list of all thread pools */ | |
65 | tpool_t *tp_back; | |
66 | pthread_mutex_t tp_mutex; /* protects the pool data */ | |
67 | pthread_cond_t tp_busycv; /* synchronization in tpool_dispatch */ | |
68 | pthread_cond_t tp_workcv; /* synchronization with workers */ | |
69 | pthread_cond_t tp_waitcv; /* synchronization in tpool_wait() */ | |
70 | tpool_active_t *tp_active; /* threads performing work */ | |
71 | tpool_job_t *tp_head; /* FIFO job queue */ | |
72 | tpool_job_t *tp_tail; | |
73 | pthread_attr_t tp_attr; /* attributes of the workers */ | |
74 | int tp_flags; /* see below */ | |
75 | uint_t tp_linger; /* seconds before idle workers exit */ | |
76 | int tp_njobs; /* number of jobs in job queue */ | |
77 | int tp_minimum; /* minimum number of worker threads */ | |
78 | int tp_maximum; /* maximum number of worker threads */ | |
79 | int tp_current; /* current number of worker threads */ | |
80 | int tp_idle; /* number of idle workers */ | |
81 | }; | |
82 | ||
83 | /* tp_flags */ | |
84 | #define TP_WAIT 0x01 /* waiting in tpool_wait() */ | |
85 | #define TP_SUSPEND 0x02 /* pool is being suspended */ | |
86 | #define TP_DESTROY 0x04 /* pool is being destroyed */ | |
87 | #define TP_ABANDON 0x08 /* pool is abandoned (auto-destroy) */ | |
88 | ||
89 | #ifdef __cplusplus | |
90 | } | |
91 | #endif | |
92 | ||
93 | #endif /* _THREAD_POOL_IMPL_H */ |