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 <[email protected]>
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: [email protected]
For additional commands, e-mail: [email protected]