summaryrefslogtreecommitdiff
path: root/include
diff options
context:
space:
mode:
authorMladen Turk <mturk@apache.org>2021-11-17 13:45:31 +0000
committerMladen Turk <mturk@apache.org>2021-11-17 13:45:31 +0000
commit0d304005ff367efc2417b9d008c5964df9607054 (patch)
tree57ccb0a8173c0a8476bd6ff169d5fa27fc07dc2b /include
parent6e807a817028aa41b234b2c70b80aea901e78505 (diff)
downloadapr-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.h4
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 */