diff options
author | Mladen Turk <mturk@apache.org> | 2021-11-17 13:45:31 +0000 |
---|---|---|
committer | Mladen Turk <mturk@apache.org> | 2021-11-17 13:45:31 +0000 |
commit | 0d304005ff367efc2417b9d008c5964df9607054 (patch) | |
tree | 57ccb0a8173c0a8476bd6ff169d5fa27fc07dc2b /include | |
parent | 6e807a817028aa41b234b2c70b80aea901e78505 (diff) | |
download | apr-0d304005ff367efc2417b9d008c5964df9607054.tar.gz |
Fix drain wakeup pipe issue when multiple threads call apr_pollset_wakeup/apr_pollcb_wakeup for the same pollset filling up drain pipe. Use atomics so that wakeup call is noop if some other thread allready done this
git-svn-id: https://svn.apache.org/repos/asf/apr/apr/trunk@1895106 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'include')
-rw-r--r-- | include/arch/unix/apr_arch_poll_private.h | 4 |
1 files changed, 3 insertions, 1 deletions
diff --git a/include/arch/unix/apr_arch_poll_private.h b/include/arch/unix/apr_arch_poll_private.h index 4c2aaa704..8dd97d1ad 100644 --- a/include/arch/unix/apr_arch_poll_private.h +++ b/include/arch/unix/apr_arch_poll_private.h @@ -123,6 +123,7 @@ struct apr_pollset_t /* Pipe descriptors used for wakeup */ apr_file_t *wakeup_pipe[2]; apr_pollfd_t wakeup_pfd; + volatile apr_uint32_t wakeup_set; apr_pollset_private_t *p; const apr_pollset_provider_t *provider; }; @@ -151,6 +152,7 @@ struct apr_pollcb_t { /* Pipe descriptors used for wakeup */ apr_file_t *wakeup_pipe[2]; apr_pollfd_t wakeup_pfd; + volatile apr_uint32_t wakeup_set; int fd; apr_pollcb_pset pollset; apr_pollfd_t **copyset; @@ -182,6 +184,6 @@ struct apr_pollcb_provider_t { apr_status_t apr_poll_create_wakeup_pipe(apr_pool_t *pool, apr_pollfd_t *pfd, apr_file_t **wakeup_pipe); apr_status_t apr_poll_close_wakeup_pipe(apr_file_t **wakeup_pipe); -void apr_poll_drain_wakeup_pipe(apr_file_t **wakeup_pipe); +void apr_poll_drain_wakeup_pipe(volatile apr_uint32_t *wakeup_set, apr_file_t **wakeup_pipe); #endif /* APR_ARCH_POLL_PRIVATE_H */ |