94 lines
2.8 KiB
C
94 lines
2.8 KiB
C
|
/*
|
||
|
* CDDL HEADER START
|
||
|
*
|
||
|
* The contents of this file are subject to the terms of the
|
||
|
* Common Development and Distribution License (the "License").
|
||
|
* You may not use this file except in compliance with the License.
|
||
|
*
|
||
|
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
|
||
|
* or http://www.opensolaris.org/os/licensing.
|
||
|
* See the License for the specific language governing permissions
|
||
|
* and limitations under the License.
|
||
|
*
|
||
|
* When distributing Covered Code, include this CDDL HEADER in each
|
||
|
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
|
||
|
* If applicable, add the following below this CDDL HEADER, with the
|
||
|
* fields enclosed by brackets "[]" replaced with your own identifying
|
||
|
* information: Portions Copyright [yyyy] [name of copyright owner]
|
||
|
*
|
||
|
* CDDL HEADER END
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* Copyright 2008 Sun Microsystems, Inc. All rights reserved.
|
||
|
* Use is subject to license terms.
|
||
|
*/
|
||
|
|
||
|
#ifndef _THREAD_POOL_IMPL_H
|
||
|
#define _THREAD_POOL_IMPL_H
|
||
|
|
||
|
#include <thread_pool.h>
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
extern "C" {
|
||
|
#endif
|
||
|
|
||
|
/*
|
||
|
* Thread pool implementation definitions.
|
||
|
* See <thread_pool.h> for interface declarations.
|
||
|
*/
|
||
|
|
||
|
/*
|
||
|
* FIFO queued job
|
||
|
*/
|
||
|
typedef struct tpool_job tpool_job_t;
|
||
|
struct tpool_job {
|
||
|
tpool_job_t *tpj_next; /* list of jobs */
|
||
|
void (*tpj_func)(void *); /* function to call */
|
||
|
void *tpj_arg; /* its argument */
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* List of active threads, linked through their stacks.
|
||
|
*/
|
||
|
typedef struct tpool_active tpool_active_t;
|
||
|
struct tpool_active {
|
||
|
tpool_active_t *tpa_next; /* list of active threads */
|
||
|
pthread_t tpa_tid; /* active thread id */
|
||
|
};
|
||
|
|
||
|
/*
|
||
|
* The thread pool.
|
||
|
*/
|
||
|
struct tpool {
|
||
|
tpool_t *tp_forw; /* circular list of all thread pools */
|
||
|
tpool_t *tp_back;
|
||
|
pthread_mutex_t tp_mutex; /* protects the pool data */
|
||
|
pthread_cond_t tp_busycv; /* synchronization in tpool_dispatch */
|
||
|
pthread_cond_t tp_workcv; /* synchronization with workers */
|
||
|
pthread_cond_t tp_waitcv; /* synchronization in tpool_wait() */
|
||
|
tpool_active_t *tp_active; /* threads performing work */
|
||
|
tpool_job_t *tp_head; /* FIFO job queue */
|
||
|
tpool_job_t *tp_tail;
|
||
|
pthread_attr_t tp_attr; /* attributes of the workers */
|
||
|
int tp_flags; /* see below */
|
||
|
uint_t tp_linger; /* seconds before idle workers exit */
|
||
|
int tp_njobs; /* number of jobs in job queue */
|
||
|
int tp_minimum; /* minimum number of worker threads */
|
||
|
int tp_maximum; /* maximum number of worker threads */
|
||
|
int tp_current; /* current number of worker threads */
|
||
|
int tp_idle; /* number of idle workers */
|
||
|
};
|
||
|
|
||
|
/* tp_flags */
|
||
|
#define TP_WAIT 0x01 /* waiting in tpool_wait() */
|
||
|
#define TP_SUSPEND 0x02 /* pool is being suspended */
|
||
|
#define TP_DESTROY 0x04 /* pool is being destroyed */
|
||
|
#define TP_ABANDON 0x08 /* pool is abandoned (auto-destroy) */
|
||
|
|
||
|
#ifdef __cplusplus
|
||
|
}
|
||
|
#endif
|
||
|
|
||
|
#endif /* _THREAD_POOL_IMPL_H */
|