[qpid-proton] branch main updated: PROTON-2696: fix clang warning/error on new raw connection test
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 229ae1dff PROTON-2696: fix clang warning/error on new raw connection test 229ae1dff is described below commit 229ae1dffc0b3999b50005767ad92a051fd8fe93 Author: Clifford Jansen AuthorDate: Fri Mar 24 11:47:38 2023 -0700 PROTON-2696: fix clang warning/error on new raw connection test --- c/tests/raw_connection_test.cpp | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/c/tests/raw_connection_test.cpp b/c/tests/raw_connection_test.cpp index 9f5a9b72e..39c7d4e32 100644 --- a/c/tests/raw_connection_test.cpp +++ b/c/tests/raw_connection_test.cpp @@ -843,12 +843,11 @@ TEST_CASE("raw connection") { namespace { class common_handler : public handler { - handler *accept_; // Handler for accepted connections bool close_on_wake_; pn_raw_connection_t *last_server_; public: - explicit common_handler(handler *accept = 0) : accept_(accept), close_on_wake_(false), last_server_(0) {} + explicit common_handler() : close_on_wake_(false), last_server_(0) {} void set_close_on_wake(bool b) { close_on_wake_ = b; } - To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org
[qpid-dispatch] branch dependabot/npm_and_yarn/console/react/prettier-2.8.7 created (now 2e8b89dc)
This is an automated email from the ASF dual-hosted git repository. github-bot pushed a change to branch dependabot/npm_and_yarn/console/react/prettier-2.8.7 in repository https://gitbox.apache.org/repos/asf/qpid-dispatch.git at 2e8b89dc Bump prettier from 2.5.1 to 2.8.7 in /console/react No new revisions were added by this update. - To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org
[qpid-proton] branch main updated: PROTON-2691: Additional fixes -Wstrict-prototypes compile warning from Clang (#390)
This is an automated email from the ASF dual-hosted git repository. jdanek 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 5db87831c PROTON-2691: Additional fixes -Wstrict-prototypes compile warning from Clang (#390) 5db87831c is described below commit 5db87831cf38c05364d1597cacbaabd81942048f Author: Jiri Daněk AuthorDate: Fri Mar 24 18:16:52 2023 +0100 PROTON-2691: Additional fixes -Wstrict-prototypes compile warning from Clang (#390) --- c/src/messenger/store.c| 2 +- c/src/messenger/transform.c| 2 +- c/src/platform/platform.c | 4 ++-- c/src/proactor/epoll.c | 4 ++-- c/src/proactor/libuv.c | 2 +- c/src/reactor/io/windows/iocp.c| 2 +- c/src/reactor/io/windows/selector.c| 2 +- c/src/reactor/reactor.c| 2 +- c/tools/include/pncompat/internal/getopt.c | 4 ++-- c/tools/msgr-common.c | 4 ++-- 10 files changed, 14 insertions(+), 14 deletions(-) diff --git a/c/src/messenger/store.c b/c/src/messenger/store.c index 3262cb205..70b2c28cf 100644 --- a/c/src/messenger/store.c +++ b/c/src/messenger/store.c @@ -84,7 +84,7 @@ void pni_entry_finalize(void *object) #define pni_entry_inspect NULL static const pn_class_t PN_CLASSCLASS(pni_entry) = PN_CLASS(pni_entry); -pni_store_t *pni_store() +pni_store_t *pni_store(void) { pni_store_t *store = (pni_store_t *) malloc(sizeof(pni_store_t)); if (!store) return NULL; diff --git a/c/src/messenger/transform.c b/c/src/messenger/transform.c index 8a5236b18..bd58e2172 100644 --- a/c/src/messenger/transform.c +++ b/c/src/messenger/transform.c @@ -81,7 +81,7 @@ static void pn_transform_finalize(void *object) #define pn_transform_compare NULL #define pn_transform_inspect NULL -pn_transform_t *pn_transform() +pn_transform_t *pn_transform(void) { static const pn_class_t clazz = PN_CLASS(pn_transform); pn_transform_t *transform = (pn_transform_t *) pn_class_new(, sizeof(pn_transform_t)); diff --git a/c/src/platform/platform.c b/c/src/platform/platform.c index 5e6a3ac41..105fdc081 100644 --- a/c/src/platform/platform.c +++ b/c/src/platform/platform.c @@ -27,12 +27,12 @@ #ifdef PN_WINAPI #include -int pn_i_getpid() { +int pn_i_getpid(void) { return (int) GetCurrentProcessId(); } #else #include -int pn_i_getpid() { +int pn_i_getpid(void) { return (int) getpid(); } #endif diff --git a/c/src/proactor/epoll.c b/c/src/proactor/epoll.c index ae9971b38..511f36213 100644 --- a/c/src/proactor/epoll.c +++ b/c/src/proactor/epoll.c @@ -1495,7 +1495,7 @@ pn_listener_t *pn_event_listener(pn_event_t *e) { return (pn_event_class(e) == PN_CLASSCLASS(pn_listener)) ? (pn_listener_t*)pn_event_context(e) : NULL; } -pn_listener_t *pn_listener() { +pn_listener_t *pn_listener(void) { pn_listener_t *l = (pn_listener_t*)calloc(1, sizeof(pn_listener_t)); if (l) { l->batch.next_event = listener_batch_next; @@ -1951,7 +1951,7 @@ static void grow_poller_bufs(pn_proactor_t* p) { ee->wanted = EPOLLIN; // for all subsequent rearms } -pn_proactor_t *pn_proactor() { +pn_proactor_t *pn_proactor(void) { if (getenv("PNI_EPOLL_NOWARM")) pni_warm_sched = false; if (getenv("PNI_EPOLL_IMMEDIATE")) pni_immediate = true; if (getenv("PNI_EPOLL_SPINS")) pni_spins = atoi(getenv("PNI_EPOLL_SPINS")); diff --git a/c/src/proactor/libuv.c b/c/src/proactor/libuv.c index aebd4a238..3bc9e77fb 100644 --- a/c/src/proactor/libuv.c +++ b/c/src/proactor/libuv.c @@ -1215,7 +1215,7 @@ static void work_free(work_t *w) { } } -pn_proactor_t *pn_proactor() { +pn_proactor_t *pn_proactor(void) { uv_once(_init_once, global_init_fn); pn_proactor_t *p = (pn_proactor_t*)calloc(1, sizeof(pn_proactor_t)); p->collector = pn_collector(); diff --git a/c/src/reactor/io/windows/iocp.c b/c/src/reactor/io/windows/iocp.c index 21fe46d5a..d247e2983 100644 --- a/c/src/reactor/io/windows/iocp.c +++ b/c/src/reactor/io/windows/iocp.c @@ -1171,7 +1171,7 @@ void pni_iocp_finalize(void *obj) pni_shared_pool_free(iocp); } -iocp_t *pni_iocp() +iocp_t *pni_iocp(void) { static const pn_class_t clazz = PN_CLASS(pni_iocp); iocp_t *iocp = (iocp_t *) pn_class_new(, sizeof(iocp_t)); diff --git a/c/src/reactor/io/windows/selector.c b/c/src/reactor/io/windows/selector.c index 8c2eb6e62..b1a1cc337 100644 --- a/c/src/reactor/io/windows/selector.c +++ b/c/src/reactor/io/windows/selector.c @@ -86,7 +86,7 @@ void pn_selector_finalize(void *obj) #define pn_selector_compare NULL #define pn_selector_inspect NULL -pn_selector_t *pni_selector() +pn_selector_t *pni_selector(void) { static const pn_class_t clazz = PN_CLASS(pn_selector); pn_selector_t *selector = (pn_selector_t *) pn_class_new(, sizeof(pn_selector_t)); diff --git a/c/src/reactor/reactor.c b/c/src/reactor/reactor.c index
[qpid-proton] branch main updated (34b4d930d -> f13bb8132)
This is an automated email from the ASF dual-hosted git repository. cliffjansen pushed a change to branch main in repository https://gitbox.apache.org/repos/asf/qpid-proton.git from 34b4d930d PROTON-2691: Fix -Wstrict-prototypes compile warning from Clang (#389) new d08e4a22e PROTON-2695: epoll raw connections - reschedule task to finish unprocessed events from an event batch. new 47b958f27 PROTON-2673: epoll raw connections - allow delivery of wake events prior to successful connect. new f13bb8132 PROTON-2673: clarify doc for pn_raw_connection_wake() The 3 revisions listed above as "new" are entirely new to this repository and will be described in separate emails. The revisions listed as "add" were already present in the repository and have only been added to this reference. Summary of changes: c/include/proton/raw_connection.h| 11 +++- c/src/proactor/epoll_raw_connection.c| 60 +++--- c/src/proactor/raw_connection-internal.h | 2 + c/src/proactor/raw_connection.c | 12 - c/tests/CMakeLists.txt | 2 +- c/tests/raw_connection_test.cpp | 87 6 files changed, 154 insertions(+), 20 deletions(-) - To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org
[qpid-proton] 02/03: PROTON-2673: epoll raw connections - allow delivery of wake events prior to successful connect.
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 commit 47b958f271ea0637046c9b85de4690bd4dbebb1d Author: Clifford Jansen AuthorDate: Thu Mar 23 17:05:49 2023 -0700 PROTON-2673: epoll raw connections - allow delivery of wake events prior to successful connect. --- c/src/proactor/epoll_raw_connection.c| 34 +--- c/src/proactor/raw_connection-internal.h | 2 ++ c/src/proactor/raw_connection.c | 12 ++- 3 files changed, 31 insertions(+), 17 deletions(-) diff --git a/c/src/proactor/epoll_raw_connection.c b/c/src/proactor/epoll_raw_connection.c index cb61d6a75..56bebee85 100644 --- a/c/src/proactor/epoll_raw_connection.c +++ b/c/src/proactor/epoll_raw_connection.c @@ -367,7 +367,18 @@ static void set_error(pn_raw_connection_t *conn, const char *msg, int err) { 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); + bool task_wake = false; + bool can_wake = pni_raw_can_wake(>raw_connection); lock(>task.mutex); + t->working = true; + if (sched_ready) +schedule_done(t); + if (pni_task_wake_pending(>task)) { +if (can_wake) + task_wake = true; // batch_next() will complete the task wake. +else + pni_task_wake_done(>task); // Complete task wake without event. + } int events = io_events; int fd = rc->psocket.epoll_io.fd; if (!rc->connected) { @@ -381,26 +392,17 @@ pn_event_batch_t *pni_raw_connection_process(task_t *t, uint32_t io_events, bool return >batch; } if (events & (EPOLLHUP | EPOLLERR)) { + // A wake can be the first event. Otherwise, wait for connection to complete. + bool event_pending = task_wake || pni_raw_wake_is_pending(>raw_connection) || pn_collector_peek(rc->raw_connection.collector); + t->working = event_pending; unlock(>task.mutex); - return NULL; + return event_pending ? >batch : NULL; } -praw_connection_connected_lh(rc); +if (events & EPOLLOUT) + praw_connection_connected_lh(rc); } unlock(>task.mutex); - bool wake = false; - lock(>mutex); - t->working = true; - if (sched_ready) { -schedule_done(t); -if (pni_task_wake_pending(>task)) { - wake = true; - pni_task_wake_done(>task); -} - } - unlock(>mutex); - - if (wake) pni_raw_wake(>raw_connection); if (events & EPOLLIN) pni_raw_read(>raw_connection, fd, rcv, set_error); if (events & EPOLLOUT) pni_raw_write(>raw_connection, fd, snd, set_error); rc->batch_empty = false; @@ -417,7 +419,7 @@ void pni_raw_connection_done(praw_connection_t *rc) { if (pn_collector_peek(rc->raw_connection.collector)) have_event = true; else { - pn_event_t *e = pni_raw_event_next(>raw_connection); + pn_event_t *e = pni_raw_batch_next(>batch); // State machine up to date. if (e) { have_event = true; diff --git a/c/src/proactor/raw_connection-internal.h b/c/src/proactor/raw_connection-internal.h index 218bf2b2d..47b0ea925 100644 --- a/c/src/proactor/raw_connection-internal.h +++ b/c/src/proactor/raw_connection-internal.h @@ -126,6 +126,8 @@ bool pni_raw_validate(pn_raw_connection_t *conn); void pni_raw_connected(pn_raw_connection_t *conn); void pni_raw_connect_failed(pn_raw_connection_t *conn); void pni_raw_wake(pn_raw_connection_t *conn); +bool pni_raw_wake_is_pending(pn_raw_connection_t *conn); +bool pni_raw_can_wake(pn_raw_connection_t *conn); void pni_raw_close(pn_raw_connection_t *conn); void pni_raw_read_close(pn_raw_connection_t *conn); void pni_raw_write_close(pn_raw_connection_t *conn); diff --git a/c/src/proactor/raw_connection.c b/c/src/proactor/raw_connection.c index a7aa21d11..fd633a284 100644 --- a/c/src/proactor/raw_connection.c +++ b/c/src/proactor/raw_connection.c @@ -475,7 +475,17 @@ void pni_raw_connect_failed(pn_raw_connection_t *conn) { } void pni_raw_wake(pn_raw_connection_t *conn) { - conn->wakepending = true; + if (conn->disconnect_state != disc_fini) +conn->wakepending = true; +} + +bool pni_raw_wake_is_pending(pn_raw_connection_t *conn) { + return conn->wakepending; +} + +bool pni_raw_can_wake(pn_raw_connection_t *conn) { + // True if DISCONNECTED event has not yet been extracted from the batch. + return (conn->disconnect_state != disc_fini); } void pni_raw_read(pn_raw_connection_t *conn, int sock, long (*recv)(int, void*, size_t), void(*set_error)(pn_raw_connection_t *, const char *, int)) { - To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org
[qpid-proton] 03/03: PROTON-2673: clarify doc for pn_raw_connection_wake()
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 commit f13bb8132d9e744c4bc4ff66d283f9d4e34965f8 Author: Clifford Jansen AuthorDate: Thu Mar 23 23:53:12 2023 -0700 PROTON-2673: clarify doc for pn_raw_connection_wake() --- c/include/proton/raw_connection.h | 11 ++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/c/include/proton/raw_connection.h b/c/include/proton/raw_connection.h index d19ff6dc5..ef5fd33a7 100644 --- a/c/include/proton/raw_connection.h +++ b/c/include/proton/raw_connection.h @@ -244,10 +244,19 @@ PNP_EXTERN bool pn_raw_connection_is_write_closed(pn_raw_connection_t *connectio * Return a @ref PN_RAW_CONNECTION_WAKE event for @p connection as soon as possible. * * At least one wake event will be returned, serialized with other @ref proactor_events - * for the same raw connection. Wakes can be "coalesced" - if several + * for the same raw connection, except as noted. Wakes can be "coalesced" - if several * @ref pn_raw_connection_wake() calls happen close together, there may be only one * @ref PN_RAW_CONNECTION_WAKE event that occurs after all of them. * + * A @ref PN_RAW_CONNECTION_WAKE event will never follow a + * @ref PN_RAW_CONNECTION_DISCONNECTED event. I.e. it will be dropped. + * + * The result of this call is undefined if called after a @ref PN_RAW_CONNECTION_DISCONNECTED + * event has been delivered and its event batch has been released by a call to + * @ref pn_proactor_done(). It is also undefined if called before the return of either + * @ref pn_proactor_raw_connect() or @ref pn_listener_raw_accept() for client or server + * raw connections respectively. + * * @note Thread-safe */ PNP_EXTERN void pn_raw_connection_wake(pn_raw_connection_t *connection); - To unsubscribe, e-mail: commits-unsubscr...@qpid.apache.org For additional commands, e-mail: commits-h...@qpid.apache.org
[qpid-proton] 01/03: PROTON-2695: epoll raw connections - reschedule task to finish unprocessed events from an event batch.
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 commit d08e4a22e86610243dab1e5c08a8fd4c1c0d001b Author: Clifford Jansen AuthorDate: Sun Mar 19 23:00:12 2023 -0700 PROTON-2695: epoll raw connections - reschedule task to finish unprocessed events from an event batch. --- c/src/proactor/epoll_raw_connection.c | 28 ++- c/tests/CMakeLists.txt| 2 +- c/tests/raw_connection_test.cpp | 87 +++ 3 files changed, 114 insertions(+), 3 deletions(-) diff --git a/c/src/proactor/epoll_raw_connection.c b/c/src/proactor/epoll_raw_connection.c index 919a4b808..cb61d6a75 100644 --- a/c/src/proactor/epoll_raw_connection.c +++ b/c/src/proactor/epoll_raw_connection.c @@ -50,6 +50,7 @@ struct praw_connection_t { struct addrinfo *ai; /* Current connect address */ bool connected; bool disconnected; + bool batch_empty; }; static void psocket_error(praw_connection_t *rc, int err, const char* msg) { @@ -317,7 +318,10 @@ static pn_event_t *pni_raw_batch_next(pn_event_batch_t *batch) { unlock(>task.mutex); if (waking) pni_raw_wake(raw); - return pni_raw_event_next(raw); + pn_event_t *e = pni_raw_event_next(raw); + if (!e || pn_event_type(e) == PN_RAW_CONNECTION_DISCONNECTED) +rc->batch_empty = true; + return e; } task_t *pni_psocket_raw_task(psocket_t* ps) { @@ -373,6 +377,7 @@ pn_event_batch_t *pni_raw_connection_process(task_t *t, uint32_t io_events, bool if (rc->disconnected) { pni_raw_connect_failed(>raw_connection); unlock(>task.mutex); + rc->batch_empty = false; return >batch; } if (events & (EPOLLHUP | EPOLLERR)) { @@ -398,19 +403,38 @@ pn_event_batch_t *pni_raw_connection_process(task_t *t, uint32_t io_events, bool if (wake) pni_raw_wake(>raw_connection); if (events & EPOLLIN) pni_raw_read(>raw_connection, fd, rcv, set_error); if (events & EPOLLOUT) pni_raw_write(>raw_connection, fd, snd, set_error); + rc->batch_empty = false; return >batch; } void pni_raw_connection_done(praw_connection_t *rc) { bool notify = false; bool ready = false; + bool have_event = false; + + // If !batch_empty, can't be sure state machine up to date, so reschedule task if necessary. + if (!rc->batch_empty) { +if (pn_collector_peek(rc->raw_connection.collector)) + have_event = true; +else { + pn_event_t *e = pni_raw_event_next(>raw_connection); + // State machine up to date. + if (e) { +have_event = true; +// Sole event. Can put back without order issues. +// Edge case, performance not important. +pn_collector_put(rc->raw_connection.collector, pn_event_class(e), pn_event_context(e), pn_event_type(e)); + } +} + } + lock(>task.mutex); pn_proactor_t *p = rc->task.proactor; tslot_t *ts = rc->task.runner; rc->task.working = false; - notify = pni_task_wake_pending(>task) && schedule(>task); // The task may be in the ready state even if we've got no raw connection // wakes outstanding because we dealt with it already in pni_raw_batch_next() + notify = (pni_task_wake_pending(>task) || have_event) && schedule(>task); ready = rc->task.ready; unlock(>task.mutex); diff --git a/c/tests/CMakeLists.txt b/c/tests/CMakeLists.txt index 641ba3c75..8ff0d8da9 100644 --- a/c/tests/CMakeLists.txt +++ b/c/tests/CMakeLists.txt @@ -79,7 +79,7 @@ if (CMAKE_CXX_COMPILER) add_c_test(c-proactor-test pn_test_proactor.cpp proactor_test.cpp) target_link_libraries(c-proactor-test qpid-proton-core qpid-proton-proactor ${PLATFORM_LIBS}) -add_c_test(c-raw-connection-test raw_connection_test.cpp $) +add_c_test(c-raw-connection-test raw_connection_test.cpp pn_test_proactor.cpp $) target_link_libraries(c-raw-connection-test qpid-proton-core ${PLATFORM_LIBS} ${PROACTOR_LIBS}) add_c_test(c-ssl-proactor-test pn_test_proactor.cpp ssl_proactor_test.cpp) diff --git a/c/tests/raw_connection_test.cpp b/c/tests/raw_connection_test.cpp index 0f31c4910..9f5a9b72e 100644 --- a/c/tests/raw_connection_test.cpp +++ b/c/tests/raw_connection_test.cpp @@ -832,3 +832,90 @@ TEST_CASE("raw connection") { } } } + +// WAKE tests require a running proactor. + +#include "../src/proactor/proactor-internal.h" +#include "./pn_test_proactor.hpp" +#include +#include + +namespace { + +class common_handler : public handler { + handler *accept_; // Handler for accepted connections + bool close_on_wake_; + pn_raw_connection_t *last_server_; + +public: + explicit common_handler(handler *accept = 0) : accept_(accept), close_on_wake_(false), last_server_(0) {} + + void set_close_on_wake(bool b) { close_on_wake_ = b; } + + pn_raw_connection_t *last_server() { return last_server_; } + + bool handle(pn_event_t *e) override { +switch (pn_event_type(e)) { +