Go to the documentation of this file.
72 pthread_mutex_init(&p_data->mutex, NULL);
73 pthread_cond_init(&p_data->cond, NULL);
75 p_data->num_threads = 0;
76 p_data->p_head = NULL;
77 p_data->p_tail = NULL;
79 p_pool->
data = p_data;
90 pthread_mutex_destroy(&p_data->
mutex);
91 pthread_cond_destroy(&p_data->
cond);
110 pthread_mutex_lock(&p_data->
mutex);
112 p_thread->
p_prev = p_thread;
113 p_thread->
p_next = p_thread;
114 p_data->
p_head = p_thread;
115 p_data->
p_tail = p_thread;
123 p_data->
p_tail = p_thread;
128 pthread_cond_signal(&p_data->
cond);
129 pthread_mutex_unlock(&p_data->
mutex);
139 pthread_mutex_lock(&p_data->
mutex);
142 #if defined(ABT_CONFIG_USE_CLOCK_GETTIME)
144 clock_gettime(CLOCK_REALTIME, &ts);
145 ts.tv_sec += (time_t)time_secs;
146 ts.tv_nsec += (long)((time_secs - (time_t)time_secs) * 1e9);
147 if (ts.tv_nsec > 1e9) {
151 pthread_cond_timedwait(&p_data->
cond, &p_data->
mutex, &ts);
157 pthread_mutex_unlock(&p_data->
mutex);
158 const int sleep_nsecs = 100;
159 struct timespec ts = { 0, sleep_nsecs };
160 nanosleep(&ts, NULL);
161 pthread_mutex_lock(&p_data->
mutex);
169 p_thread = p_data->
p_head;
186 pthread_mutex_unlock(&p_data->
mutex);
194 ts_out->tv_sec = (time_t)seconds;
195 ts_out->tv_nsec = (long)((seconds - ts_out->tv_sec) * 1000000000.0);
205 pthread_mutex_lock(&p_data->
mutex);
210 pthread_cond_timedwait(&p_data->
cond, &p_data->
mutex, &ts);
214 p_thread = p_data->
p_head;
231 pthread_mutex_unlock(&p_data->
mutex);
243 pthread_mutex_lock(&p_data->
mutex);
245 p_thread = p_data->
p_head;
262 pthread_mutex_unlock(&p_data->
mutex);
277 pthread_mutex_lock(&p_data->
mutex);
284 if (p_thread == p_data->
p_head) {
286 }
else if (p_thread == p_data->
p_tail) {
293 pthread_mutex_unlock(&p_data->
mutex);
307 pthread_mutex_lock(&p_data->
mutex);
311 while (num_threads--) {
315 p_thread = p_thread->
p_next;
318 pthread_mutex_unlock(&p_data->
mutex);
ABT_pool_get_size_fn p_get_size
static data_t * pool_get_data_ptr(void *p_data)
int ABT_bool
Boolean type.
ABT_pool_remove_fn p_remove
struct ABT_thread_opaque * ABT_thread
Work unit handle type.
ABT_pool_print_all_fn p_print_all
static int pool_free(ABT_pool pool)
#define ABT_ERR_POOL
Error code: error related to a pool.
#define ABTI_CHECK_ERROR(abt_errno)
static ABT_bool unit_is_in_pool(ABT_unit unit)
static ABT_thread ABTI_thread_get_handle(ABTI_thread *p_thread)
struct ABT_pool_opaque * ABT_pool
Pool handle type.
ABTU_ret_err int ABTI_pool_get_fifo_wait_def(ABT_pool_access access, ABTI_pool_def *p_def)
static ABT_unit pool_pop_timedwait(ABT_pool pool, double abstime_secs)
static void convert_double_sec_to_timespec(struct timespec *ts_out, double seconds)
ABT_unit_is_in_pool_fn u_is_in_pool
struct ABT_pool_config_opaque * ABT_pool_config
Pool configuration handle type.
static ABTU_ret_err int ABTU_malloc(size_t size, void **p_ptr)
static void ABTD_atomic_relaxed_store_int(ABTD_atomic_int *ptr, int val)
static int pool_print_all(ABT_pool pool, void *arg, void(*print_fn)(void *, ABT_unit))
struct ABT_unit_opaque * ABT_unit
Work unit handle type for scheduling.
ABT_unit_create_from_thread_fn u_create_from_thread
#define ABTI_ASSERT(cond)
static ABT_unit unit_create_from_thread(ABT_thread thread)
ABT_pool_pop_timedwait_fn p_pop_timedwait
ABTD_atomic_int is_in_pool
static void pool_push(ABT_pool pool, ABT_unit unit)
static void unit_free(ABT_unit *unit)
#define ABT_SUCCESS
Error code: the routine returns successfully.
ABT_pool_pop_wait_fn p_pop_wait
static int ABTD_atomic_acquire_load_int(const ABTD_atomic_int *ptr)
#define ABT_TRUE
True constant for ABT_bool.
static ABTI_pool * ABTI_pool_get_ptr(ABT_pool pool)
#define ABT_FALSE
False constant for ABT_bool.
static size_t pool_get_size(ABT_pool pool)
static void ABTU_free(void *ptr)
static ABT_unit pool_pop_wait(ABT_pool pool, double time_secs)
static ABT_unit pool_pop(ABT_pool pool)
static ABT_thread unit_get_thread(ABT_unit unit)
#define ABTI_CHECK_TRUE(cond, abt_errno)
ABT_unit_get_thread_fn u_get_thread
static void ABTD_atomic_release_store_int(ABTD_atomic_int *ptr, int val)
static ABTI_thread * ABTI_thread_get_ptr(ABT_thread thread)
static double ABTI_get_wtime(void)
static int pool_remove(ABT_pool pool, ABT_unit unit)
ABT_pool_access
Pool access type.
static int pool_init(ABT_pool pool, ABT_pool_config config)