* where the forking thread will unlock it again.
*/
pthread_mutex_t fork_mutex;
-
- bool per_thread_cwd;
};
static pthread_mutex_t pthreadpools_mutex = PTHREAD_MUTEX_INITIALIZER;
static struct pthreadpool *pthreadpools = NULL;
-static bool pthreadpool_support_thread_cwd = false;
static pthread_once_t pthreadpool_atfork_initialized = PTHREAD_ONCE_INIT;
static void pthreadpool_prep_atfork(void);
pool->max_threads = max_threads;
pool->num_idle = 0;
pool->prefork_cond = NULL;
- if (max_threads != 0) {
- pool->per_thread_cwd = pthreadpool_support_thread_cwd;
- } else {
- pool->per_thread_cwd = false;
- }
ret = pthread_mutex_lock(&pthreadpools_mutex);
if (ret != 0) {
return ret;
}
-bool pthreadpool_per_thread_cwd(struct pthreadpool *pool)
-{
- if (pool->stopped) {
- return false;
- }
-
- return pool->per_thread_cwd;
-}
-
static void pthreadpool_prepare_pool(struct pthreadpool *pool)
{
int ret;
static void pthreadpool_prep_atfork(void)
{
-#ifdef HAVE_UNSHARE_CLONE_FS
- int res;
-
- /* remember if unshare(CLONE_FS) works. */
- res = unshare(CLONE_FS);
- if (res == 0) {
- pthreadpool_support_thread_cwd = true;
- }
-#endif
-
pthread_atfork(pthreadpool_prepare, pthreadpool_parent,
pthreadpool_child);
}
struct pthreadpool *pool = (struct pthreadpool *)arg;
int res;
-#ifdef HAVE_UNSHARE_CLONE_FS
- if (pool->per_thread_cwd) {
- res = unshare(CLONE_FS);
- assert(res == 0);
- }
-#endif
-
res = pthread_mutex_lock(&pool->mutex);
if (res != 0) {
return NULL;
*/
size_t pthreadpool_queued_jobs(struct pthreadpool *pool);
-/**
- * @brief Check for per thread current working directory support of pthreadpool
- *
- * Since Linux kernel 2.6.16, unshare(CLONE_FS) is supported,
- * which provides a per thread current working directory
- * and allows [f]chdir() within the worker threads.
- *
- * Note that this doesn't work on some contraint container setups,
- * the complete unshare() syscall might be rejected.
- * pthreadpool_per_thread_cwd() returns what is available
- * at runtime, so the callers should really check this!
- *
- * @param[in] pool The pool to run the job on
- * @return supported: true, otherwise: false
- */
-bool pthreadpool_per_thread_cwd(struct pthreadpool *pool);
-
/**
* @brief Stop a pthreadpool
*