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 a19aa87 PROTON-2484: epoll proactor - remove task memory reference after possible free a19aa87 is described below commit a19aa87e66e4207da0dee51d0315bc087aabcd30 Author: Cliff Jansen <cliffjan...@apache.org> AuthorDate: Thu Jan 13 09:19:35 2022 -0800 PROTON-2484: epoll proactor - remove task memory reference after possible free --- c/src/proactor/epoll.c | 22 ++++++++++++++-------- c/src/proactor/epoll_raw_connection.c | 8 +++++--- 2 files changed, 19 insertions(+), 11 deletions(-) diff --git a/c/src/proactor/epoll.c b/c/src/proactor/epoll.c index d2f394a..aa1bd1b 100644 --- a/c/src/proactor/epoll.c +++ b/c/src/proactor/epoll.c @@ -900,6 +900,7 @@ static void pconnection_forced_shutdown(pconnection_t *pc) { // Called from timer_manager with no locks. void pni_pconnection_timeout(pconnection_t *pc) { bool notify = false; + pn_proactor_t *p = pc->task.proactor; uint64_t now = pn_proactor_now_64(); lock(&pc->task.mutex); if (!pc->task.closing) { @@ -912,7 +913,7 @@ void pni_pconnection_timeout(pconnection_t *pc) { } unlock(&pc->task.mutex); if (notify) - notify_poller(pc->task.proactor); + notify_poller(p); } static pn_event_t *pconnection_batch_next(pn_event_batch_t *batch) { @@ -1460,21 +1461,24 @@ static void pconnection_tick(pconnection_t *pc) { } void pn_connection_wake(pn_connection_t* c) { - bool notify = false; pconnection_t *pc = get_pconnection(c); if (pc) { + pn_proactor_t *p = pc->task.proactor; + bool notify = false; + lock(&pc->task.mutex); if (!pc->task.closing) { notify = pni_task_wake(&pc->task); } unlock(&pc->task.mutex); + if (notify) notify_poller(p); } - if (notify) notify_poller(pc->task.proactor); } void pn_proactor_release_connection(pn_connection_t *c) { bool notify = false; pconnection_t *pc = get_pconnection(c); + pn_proactor_t *p = pc->task.proactor; if (pc) { set_pconnection(c, NULL); lock(&pc->task.mutex); @@ -1483,7 +1487,7 @@ void pn_proactor_release_connection(pn_connection_t *c) { notify = schedule(&pc->task); unlock(&pc->task.mutex); } - if (notify) notify_poller(pc->task.proactor); + if (notify) notify_poller(p); } // ======================================================================== @@ -1666,13 +1670,14 @@ static void listener_begin_close(pn_listener_t* l) { void pn_listener_close(pn_listener_t* l) { bool notify = false; + pn_proactor_t *p = l->task.proactor; lock(&l->task.mutex); if (l->task.proactor && !l->task.closing) { listener_begin_close(l); notify = schedule(&l->task); } unlock(&l->task.mutex); - if (notify) notify_poller(l->task.proactor); + if (notify) notify_poller(p); } static void listener_forced_shutdown(pn_listener_t *l) { @@ -1859,8 +1864,9 @@ pn_record_t *pn_listener_attachments(pn_listener_t *l) { void pn_listener_accept2(pn_listener_t *l, pn_connection_t *c, pn_transport_t *t) { pconnection_t *pc = (pconnection_t*) malloc(sizeof(pconnection_t)); - assert(pc); // TODO: memory safety - const char *err = pconnection_setup(pc, pn_listener_proactor(l), c, t, true, "", 0); + pn_proactor_t *p = pn_listener_proactor(l); + assert(pc && p); // TODO: memory safety + const char *err = pconnection_setup(pc, p, c, t, true, "", 0); if (err) { PN_LOG_DEFAULT(PN_SUBSYSTEM_EVENT, PN_LEVEL_ERROR, "pn_listener_accept failure: %s", err); return; @@ -1895,7 +1901,7 @@ void pn_listener_accept2(pn_listener_t *l, pn_connection_t *c, pn_transport_t *t notify = schedule(&l->task); unlock(&pc->task.mutex); unlock(&l->task.mutex); - if (notify) notify_poller(l->task.proactor); + if (notify) notify_poller(p); } diff --git a/c/src/proactor/epoll_raw_connection.c b/c/src/proactor/epoll_raw_connection.c index 89e315f..a025698 100644 --- a/c/src/proactor/epoll_raw_connection.c +++ b/c/src/proactor/epoll_raw_connection.c @@ -211,8 +211,9 @@ void pn_proactor_raw_connect(pn_proactor_t *p, pn_raw_connection_t *rc, const ch void pn_listener_raw_accept(pn_listener_t *l, pn_raw_connection_t *rc) { assert(rc); + pn_proactor_t *p = pn_listener_proactor(l); praw_connection_t *prc = containerof(rc, praw_connection_t, raw_connection); - praw_connection_init(prc, pn_listener_proactor(l), rc); + praw_connection_init(prc, p, rc); // TODO: fuller sanity check on input args int err = 0; @@ -246,7 +247,7 @@ void pn_listener_raw_accept(pn_listener_t *l, pn_raw_connection_t *rc) { } unlock(&prc->task.mutex); unlock(&l->task.mutex); - if (notify) notify_poller(l->task.proactor); + if (notify) notify_poller(p); } const pn_netaddr_t *pn_raw_connection_local_addr(pn_raw_connection_t *rc) { @@ -264,12 +265,13 @@ const pn_netaddr_t *pn_raw_connection_remote_addr(pn_raw_connection_t *rc) { void pn_raw_connection_wake(pn_raw_connection_t *rc) { bool notify = false; praw_connection_t *prc = containerof(rc, praw_connection_t, raw_connection); + pn_proactor_t *p = prc->task.proactor; lock(&prc->task.mutex); if (!prc->task.closing) { notify = pni_task_wake(&prc->task); } unlock(&prc->task.mutex); - if (notify) notify_poller(prc->task.proactor); + if (notify) notify_poller(p); } static inline void set_closed(pn_raw_connection_t *rc) --------------------------------------------------------------------- To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org