/* Copyright (C) 2018 Daniel Schultz This file is part of FLINT. FLINT is free software: you can redistribute it and/or modify it under the terms of the GNU Lesser General Public License (LGPL) as published by the Free Software Foundation; either version 2.1 of the License, or (at your option) any later version. See . */ #ifndef THREAD_POOL_H #define THREAD_POOL_H /* for some reason this define needs to be outside of the next if */ #ifndef _GNU_SOURCE #define _GNU_SOURCE #endif #if FLINT_USES_CPUSET #include #endif #include "flint.h" #if FLINT_USES_PTHREAD #include #endif #ifdef __cplusplus extern "C" { #endif typedef struct { #if FLINT_USES_PTHREAD pthread_t pth; pthread_mutex_t mutex; pthread_cond_t sleep1; pthread_cond_t sleep2; #endif volatile int idx; volatile int available; volatile int max_workers; void (* fxn)(void *); void * fxnarg; volatile int working; volatile int exit; } thread_pool_entry_struct; typedef thread_pool_entry_struct thread_pool_entry_t[1]; typedef struct { #if FLINT_USES_CPUSET && FLINT_USES_PTHREAD cpu_set_t original_affinity; #endif #if FLINT_USES_PTHREAD pthread_mutex_t mutex; #endif thread_pool_entry_struct * tdata; slong length; } thread_pool_struct; typedef thread_pool_struct thread_pool_t[1]; typedef int thread_pool_handle; FLINT_DLL extern thread_pool_t global_thread_pool; FLINT_DLL extern int global_thread_pool_initialized; FLINT_DLL void * thread_pool_idle_loop(void * varg); FLINT_DLL void thread_pool_init(thread_pool_t T, slong l); FLINT_DLL int thread_pool_set_affinity(thread_pool_t T, int * cpus, slong length); FLINT_DLL int thread_pool_restore_affinity(thread_pool_t T); FLINT_DLL slong thread_pool_get_size(thread_pool_t T); FLINT_DLL int thread_pool_set_size(thread_pool_t T, slong new_size); FLINT_DLL slong thread_pool_request(thread_pool_t T, thread_pool_handle * out, slong requested); FLINT_DLL void thread_pool_wake(thread_pool_t T, thread_pool_handle i, int max_workers, void (*f)(void*), void * a); FLINT_DLL void thread_pool_wait(thread_pool_t T, thread_pool_handle i); FLINT_DLL void thread_pool_give_back(thread_pool_t T, thread_pool_handle i); FLINT_DLL void thread_pool_clear(thread_pool_t T); /* misc internal helpers *****************************************************/ FLINT_DLL void _thread_pool_distribute_work_2(slong start, slong stop, slong * Astart, slong * Astop, slong Alen, slong * Bstart, slong * Bstop, slong Blen); FLINT_DLL ulong _thread_pool_find_work_2(ulong a, ulong alpha, ulong b, ulong beta, ulong yn, ulong yd); #ifdef __cplusplus } #endif #endif