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

Reply via email to