xref: /freebsd-src/sys/contrib/openzfs/lib/libtpool/thread_pool_impl.h (revision eda14cbc264d6969b02f2b1994cef11148e914f1)
1*eda14cbcSMatt Macy /*
2*eda14cbcSMatt Macy  * CDDL HEADER START
3*eda14cbcSMatt Macy  *
4*eda14cbcSMatt Macy  * The contents of this file are subject to the terms of the
5*eda14cbcSMatt Macy  * Common Development and Distribution License (the "License").
6*eda14cbcSMatt Macy  * You may not use this file except in compliance with the License.
7*eda14cbcSMatt Macy  *
8*eda14cbcSMatt Macy  * You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
9*eda14cbcSMatt Macy  * or http://www.opensolaris.org/os/licensing.
10*eda14cbcSMatt Macy  * See the License for the specific language governing permissions
11*eda14cbcSMatt Macy  * and limitations under the License.
12*eda14cbcSMatt Macy  *
13*eda14cbcSMatt Macy  * When distributing Covered Code, include this CDDL HEADER in each
14*eda14cbcSMatt Macy  * file and include the License file at usr/src/OPENSOLARIS.LICENSE.
15*eda14cbcSMatt Macy  * If applicable, add the following below this CDDL HEADER, with the
16*eda14cbcSMatt Macy  * fields enclosed by brackets "[]" replaced with your own identifying
17*eda14cbcSMatt Macy  * information: Portions Copyright [yyyy] [name of copyright owner]
18*eda14cbcSMatt Macy  *
19*eda14cbcSMatt Macy  * CDDL HEADER END
20*eda14cbcSMatt Macy  */
21*eda14cbcSMatt Macy 
22*eda14cbcSMatt Macy /*
23*eda14cbcSMatt Macy  * Copyright 2008 Sun Microsystems, Inc.  All rights reserved.
24*eda14cbcSMatt Macy  * Use is subject to license terms.
25*eda14cbcSMatt Macy  */
26*eda14cbcSMatt Macy 
27*eda14cbcSMatt Macy #ifndef _THREAD_POOL_IMPL_H
28*eda14cbcSMatt Macy #define	_THREAD_POOL_IMPL_H
29*eda14cbcSMatt Macy 
30*eda14cbcSMatt Macy #include <thread_pool.h>
31*eda14cbcSMatt Macy 
32*eda14cbcSMatt Macy #ifdef	__cplusplus
33*eda14cbcSMatt Macy extern "C" {
34*eda14cbcSMatt Macy #endif
35*eda14cbcSMatt Macy 
36*eda14cbcSMatt Macy /*
37*eda14cbcSMatt Macy  * Thread pool implementation definitions.
38*eda14cbcSMatt Macy  * See <thread_pool.h> for interface declarations.
39*eda14cbcSMatt Macy  */
40*eda14cbcSMatt Macy 
41*eda14cbcSMatt Macy /*
42*eda14cbcSMatt Macy  * FIFO queued job
43*eda14cbcSMatt Macy  */
44*eda14cbcSMatt Macy typedef struct tpool_job tpool_job_t;
45*eda14cbcSMatt Macy struct tpool_job {
46*eda14cbcSMatt Macy 	tpool_job_t	*tpj_next;		/* list of jobs */
47*eda14cbcSMatt Macy 	void		(*tpj_func)(void *);	/* function to call */
48*eda14cbcSMatt Macy 	void		*tpj_arg;		/* its argument */
49*eda14cbcSMatt Macy };
50*eda14cbcSMatt Macy 
51*eda14cbcSMatt Macy /*
52*eda14cbcSMatt Macy  * List of active threads, linked through their stacks.
53*eda14cbcSMatt Macy  */
54*eda14cbcSMatt Macy typedef struct tpool_active tpool_active_t;
55*eda14cbcSMatt Macy struct tpool_active {
56*eda14cbcSMatt Macy 	tpool_active_t	*tpa_next;	/* list of active threads */
57*eda14cbcSMatt Macy 	pthread_t	tpa_tid;	/* active thread id */
58*eda14cbcSMatt Macy };
59*eda14cbcSMatt Macy 
60*eda14cbcSMatt Macy /*
61*eda14cbcSMatt Macy  * The thread pool.
62*eda14cbcSMatt Macy  */
63*eda14cbcSMatt Macy struct tpool {
64*eda14cbcSMatt Macy 	tpool_t		*tp_forw;	/* circular list of all thread pools */
65*eda14cbcSMatt Macy 	tpool_t		*tp_back;
66*eda14cbcSMatt Macy 	pthread_mutex_t	tp_mutex;	/* protects the pool data */
67*eda14cbcSMatt Macy 	pthread_cond_t	tp_busycv;	/* synchronization in tpool_dispatch */
68*eda14cbcSMatt Macy 	pthread_cond_t	tp_workcv;	/* synchronization with workers */
69*eda14cbcSMatt Macy 	pthread_cond_t	tp_waitcv;	/* synchronization in tpool_wait() */
70*eda14cbcSMatt Macy 	tpool_active_t	*tp_active;	/* threads performing work */
71*eda14cbcSMatt Macy 	tpool_job_t	*tp_head;	/* FIFO job queue */
72*eda14cbcSMatt Macy 	tpool_job_t	*tp_tail;
73*eda14cbcSMatt Macy 	pthread_attr_t	tp_attr;	/* attributes of the workers */
74*eda14cbcSMatt Macy 	int		tp_flags;	/* see below */
75*eda14cbcSMatt Macy 	uint_t		tp_linger;	/* seconds before idle workers exit */
76*eda14cbcSMatt Macy 	int		tp_njobs;	/* number of jobs in job queue */
77*eda14cbcSMatt Macy 	int		tp_minimum;	/* minimum number of worker threads */
78*eda14cbcSMatt Macy 	int		tp_maximum;	/* maximum number of worker threads */
79*eda14cbcSMatt Macy 	int		tp_current;	/* current number of worker threads */
80*eda14cbcSMatt Macy 	int		tp_idle;	/* number of idle workers */
81*eda14cbcSMatt Macy };
82*eda14cbcSMatt Macy 
83*eda14cbcSMatt Macy /* tp_flags */
84*eda14cbcSMatt Macy #define	TP_WAIT		0x01		/* waiting in tpool_wait() */
85*eda14cbcSMatt Macy #define	TP_SUSPEND	0x02		/* pool is being suspended */
86*eda14cbcSMatt Macy #define	TP_DESTROY	0x04		/* pool is being destroyed */
87*eda14cbcSMatt Macy #define	TP_ABANDON	0x08		/* pool is abandoned (auto-destroy) */
88*eda14cbcSMatt Macy 
89*eda14cbcSMatt Macy #ifdef	__cplusplus
90*eda14cbcSMatt Macy }
91*eda14cbcSMatt Macy #endif
92*eda14cbcSMatt Macy 
93*eda14cbcSMatt Macy #endif /* _THREAD_POOL_IMPL_H */
94