diff options
author | Yann Ylavic <ylavic@apache.org> | 2020-12-03 20:19:40 +0000 |
---|---|---|
committer | Yann Ylavic <ylavic@apache.org> | 2020-12-03 20:19:40 +0000 |
commit | ee6a4a8ba864740c7f3fbc331d197d260e1504a5 (patch) | |
tree | 46cb4047baea2814e134333c6a710b9fd1aed60d /include/arch | |
parent | 150cc61d491d51c8fe3b5c2eb7b3db74efbdb3fa (diff) | |
download | apr-ee6a4a8ba864740c7f3fbc331d197d260e1504a5.tar.gz |
apr_thread: destroy the thread's pool at _join() time, unless _detach()ed.
Destroying a joinable thread pool from apr_thread_exit() or when the thread
function returns, i.e. from inside the thread itself, is racy or deadlocky
with APR_POOL_DEBUG, with the parent pool being destroyed.
This commit adds a ->detached flag in each arch's apr_thread_t struct to track
whether a thread is detached (either at _create() or _detach() time). If
detached, the pool is destroyed when the thread exits, otherwise when the
thread is joined with apr_thread_join().
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1884077 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'include/arch')
-rw-r--r-- | include/arch/beos/apr_arch_threadproc.h | 1 | ||||
-rw-r--r-- | include/arch/netware/apr_arch_threadproc.h | 1 | ||||
-rw-r--r-- | include/arch/unix/apr_arch_threadproc.h | 1 | ||||
-rw-r--r-- | include/arch/win32/apr_arch_threadproc.h | 1 |
4 files changed, 4 insertions, 0 deletions
diff --git a/include/arch/beos/apr_arch_threadproc.h b/include/arch/beos/apr_arch_threadproc.h index 13de05363..b7db0a300 100644 --- a/include/arch/beos/apr_arch_threadproc.h +++ b/include/arch/beos/apr_arch_threadproc.h @@ -45,6 +45,7 @@ struct apr_thread_t { void *data; apr_thread_start_t func; apr_status_t exitval; + int detached; }; struct apr_threadattr_t { diff --git a/include/arch/netware/apr_arch_threadproc.h b/include/arch/netware/apr_arch_threadproc.h index 2fee2c00e..ce217aaba 100644 --- a/include/arch/netware/apr_arch_threadproc.h +++ b/include/arch/netware/apr_arch_threadproc.h @@ -36,6 +36,7 @@ struct apr_thread_t { void *data; apr_thread_start_t func; apr_status_t exitval; + int detached; }; struct apr_threadattr_t { diff --git a/include/arch/unix/apr_arch_threadproc.h b/include/arch/unix/apr_arch_threadproc.h index 7a3b3c092..adeb51c8a 100644 --- a/include/arch/unix/apr_arch_threadproc.h +++ b/include/arch/unix/apr_arch_threadproc.h @@ -59,6 +59,7 @@ struct apr_thread_t { void *data; apr_thread_start_t func; apr_status_t exitval; + int detached; }; struct apr_threadattr_t { diff --git a/include/arch/win32/apr_arch_threadproc.h b/include/arch/win32/apr_arch_threadproc.h index 9aee660fd..76a3c01e4 100644 --- a/include/arch/win32/apr_arch_threadproc.h +++ b/include/arch/win32/apr_arch_threadproc.h @@ -31,6 +31,7 @@ struct apr_thread_t { void *data; apr_thread_start_t func; apr_status_t exitval; + int exited; }; struct apr_threadattr_t { |