This is an automated email from the ASF dual-hosted git repository. cliffjansen pushed a commit to branch main in repository https://gitbox.apache.org/repos/asf/qpid-proton.git
The following commit(s) were added to refs/heads/main by this push: new 3701f04 PROTON-2436: epoll raw connection TSAN race fix 3701f04 is described below commit 3701f04534cbfa457e1724e0177ca8df234de565 Author: Cliff Jansen <cliffjan...@apache.org> AuthorDate: Tue Jan 11 07:01:34 2022 -0800 PROTON-2436: epoll raw connection TSAN race fix --- c/src/proactor/epoll-internal.h | 3 ++- c/src/proactor/epoll.c | 5 ++++- c/src/proactor/epoll_raw_connection.c | 8 ++++++-- 3 files changed, 12 insertions(+), 4 deletions(-) diff --git a/c/src/proactor/epoll-internal.h b/c/src/proactor/epoll-internal.h index f0afc9e..984724f 100644 --- a/c/src/proactor/epoll-internal.h +++ b/c/src/proactor/epoll-internal.h @@ -381,7 +381,8 @@ void configure_socket(int sock); accepted_t *listener_accepted_next(pn_listener_t *listener); task_t *pni_psocket_raw_task(psocket_t *ps); -pn_event_batch_t *pni_raw_connection_process(task_t *t, bool sched_ready); +psocket_t *pni_task_raw_psocket(task_t *t); +pn_event_batch_t *pni_raw_connection_process(task_t *t, uint32_t io_events, bool sched_ready); typedef struct praw_connection_t praw_connection_t; task_t *pni_raw_connection_task(praw_connection_t *rc); diff --git a/c/src/proactor/epoll.c b/c/src/proactor/epoll.c index 61e4dbd..adce8cd 100644 --- a/c/src/proactor/epoll.c +++ b/c/src/proactor/epoll.c @@ -2221,8 +2221,11 @@ static pn_event_batch_t *process(task_t *tsk) { break; } case RAW_CONNECTION: { + psocket_t *ps = pni_task_raw_psocket(tsk); + uint32_t events = ps->sched_io_events; + if (events) ps->sched_io_events = 0; unlock(&p->sched_mutex); - batch = pni_raw_connection_process(tsk, tsk_ready); + batch = pni_raw_connection_process(tsk, events, tsk_ready); break; } case TIMER_MANAGER: { diff --git a/c/src/proactor/epoll_raw_connection.c b/c/src/proactor/epoll_raw_connection.c index 94d6460..89e315f 100644 --- a/c/src/proactor/epoll_raw_connection.c +++ b/c/src/proactor/epoll_raw_connection.c @@ -320,6 +320,10 @@ task_t *pni_psocket_raw_task(psocket_t* ps) { return &containerof(ps, praw_connection_t, psocket)->task; } +psocket_t *pni_task_raw_psocket(task_t *t) { + return &containerof(t, praw_connection_t, task)->psocket; +} + praw_connection_t *pni_batch_raw_connection(pn_event_batch_t *batch) { return (batch->next_event == pni_raw_batch_next) ? containerof(batch, praw_connection_t, batch) : NULL; @@ -349,10 +353,10 @@ static void set_error(pn_raw_connection_t *conn, const char *msg, int err) { psocket_error(containerof(conn, praw_connection_t, raw_connection), err, msg); } -pn_event_batch_t *pni_raw_connection_process(task_t *t, bool sched_ready) { +pn_event_batch_t *pni_raw_connection_process(task_t *t, uint32_t io_events, bool sched_ready) { praw_connection_t *rc = containerof(t, praw_connection_t, task); lock(&rc->task.mutex); - int events = rc->psocket.sched_io_events; + int events = io_events; int fd = rc->psocket.epoll_io.fd; if (!rc->connected) { if (events & (EPOLLHUP | EPOLLERR)) { --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org