diff --git a/msgq_repo/libmsgq.a b/msgq_repo/libmsgq.a index c41c252ef6..fbac6e453f 100644 Binary files a/msgq_repo/libmsgq.a and b/msgq_repo/libmsgq.a differ diff --git a/msgq_repo/msgq/ipc_pyx.so b/msgq_repo/msgq/ipc_pyx.so index 3453001a9e..a13a6b6f60 100755 Binary files a/msgq_repo/msgq/ipc_pyx.so and b/msgq_repo/msgq/ipc_pyx.so differ diff --git a/msgq_repo/msgq/msgq.cc b/msgq_repo/msgq/msgq.cc index d65fc9ebcc..94564194b7 100644 --- a/msgq_repo/msgq/msgq.cc +++ b/msgq_repo/msgq/msgq.cc @@ -443,6 +443,8 @@ int msgq_poll(msgq_pollitem_t * items, size_t nitems, int timeout){ if (items[i].revents) num++; } + if (timeout == 0) return num; + int ms = (timeout == -1) ? 100 : timeout; #ifdef __APPLE__ diff --git a/msgq_repo/msgq/msgq_tests.cc b/msgq_repo/msgq/msgq_tests.cc index 056b941d3b..5efb7aca09 100644 --- a/msgq_repo/msgq/msgq_tests.cc +++ b/msgq_repo/msgq/msgq_tests.cc @@ -1,4 +1,6 @@ #include +#include +#include #include #include "msgq/test_runner.h" #include "msgq/msgq.h" @@ -20,6 +22,89 @@ TEST_CASE("ALIGN") REQUIRE(ALIGN(99999) == 100000); } +TEST_CASE("msgq_poll nonblocking readiness") +{ + cleanup_test_queue(); + msgq_queue_t writer, first, second; + msgq_new_queue(&writer, "test_queue", 1024); + msgq_init_publisher(&writer); + msgq_new_queue(&first, "test_queue", 1024); + msgq_init_subscriber(&first); + msgq_new_queue(&second, "test_queue", 1024); + msgq_init_subscriber(&second); + + msgq_pollitem_t items[] = {{&first, 1}, {&second, 1}}; + REQUIRE(msgq_poll(nullptr, 0, 0) == 0); + REQUIRE(msgq_poll(items, 2, 0) == 0); + REQUIRE(items[0].revents == 0); + REQUIRE(items[1].revents == 0); + + char data[] = "poll payload"; + msgq_msg_t outgoing, incoming; + msgq_msg_init_data(&outgoing, data, sizeof(data)); + REQUIRE(msgq_msg_send(&outgoing, &writer) == sizeof(data)); + REQUIRE(msgq_poll(items, 2, 0) == 2); + REQUIRE(items[0].revents == 1); + REQUIRE(items[1].revents == 1); + REQUIRE(msgq_msg_recv(&incoming, &first) == sizeof(data)); + REQUIRE(memcmp(incoming.data, data, sizeof(data)) == 0); + msgq_msg_close(&incoming); + + REQUIRE(msgq_poll(items, 2, 0) == 1); + REQUIRE(items[0].revents == 0); + REQUIRE(items[1].revents == 1); + REQUIRE(msgq_msg_recv(&incoming, &second) == sizeof(data)); + REQUIRE(memcmp(incoming.data, data, sizeof(data)) == 0); + msgq_msg_close(&incoming); + REQUIRE(msgq_poll(items, 2, 0) == 0); + REQUIRE(items[0].revents == 0); + REQUIRE(items[1].revents == 0); + + msgq_msg_close(&outgoing); + msgq_close_queue(&second); + msgq_close_queue(&first); + msgq_close_queue(&writer); + cleanup_test_queue(); +} + +TEST_CASE("msgq_poll waiting modes") +{ + for (int timeout : {1000, -1}) { + cleanup_test_queue(); + msgq_queue_t writer, reader; + msgq_new_queue(&writer, "test_queue", 1024); + msgq_init_publisher(&writer); + msgq_new_queue(&reader, "test_queue", 1024); + msgq_init_subscriber(&reader); + msgq_pollitem_t item{&reader, 1}; + + auto start = std::chrono::steady_clock::now(); + REQUIRE(msgq_poll(&item, 1, 2) == 0); + REQUIRE(item.revents == 0); + REQUIRE(std::chrono::steady_clock::now() - start >= std::chrono::milliseconds(2)); + + msgq_msg_t outgoing; + msgq_msg_init_size(&outgoing, 1); + outgoing.data[0] = 'p'; + std::thread sender([&]() { + std::this_thread::sleep_for(std::chrono::milliseconds(2)); + msgq_msg_send(&outgoing, &writer); + }); + int received = msgq_poll(&item, 1, timeout); + sender.join(); + REQUIRE(received == 1); + REQUIRE(item.revents == 1); + msgq_msg_t incoming; + REQUIRE(msgq_msg_recv(&incoming, &reader) == 1); + REQUIRE(incoming.data[0] == 'p'); + msgq_msg_close(&incoming); + msgq_msg_close(&outgoing); + msgq_close_queue(&reader); + msgq_close_queue(&writer); + cleanup_test_queue(); + } +} + TEST_CASE("msgq_msg_init_size") { const size_t msg_size = 30; diff --git a/msgq_repo/msgq/visionipc/visionipc_pyx.so b/msgq_repo/msgq/visionipc/visionipc_pyx.so index b4f95da4ec..38b8d193a3 100755 Binary files a/msgq_repo/msgq/visionipc/visionipc_pyx.so and b/msgq_repo/msgq/visionipc/visionipc_pyx.so differ diff --git a/openpilot/cereal/messaging/bridge b/openpilot/cereal/messaging/bridge index fa01aa7f95..6b5e68107f 100755 Binary files a/openpilot/cereal/messaging/bridge and b/openpilot/cereal/messaging/bridge differ diff --git a/openpilot/selfdrive/pandad/pandad b/openpilot/selfdrive/pandad/pandad index 0f3a6fd54b..4dd24dda15 100755 Binary files a/openpilot/selfdrive/pandad/pandad and b/openpilot/selfdrive/pandad/pandad differ diff --git a/openpilot/system/camerad/camerad b/openpilot/system/camerad/camerad index 07c6f6de2b..b12f39d8d9 100755 Binary files a/openpilot/system/camerad/camerad and b/openpilot/system/camerad/camerad differ diff --git a/openpilot/system/loggerd/encoderd b/openpilot/system/loggerd/encoderd index fd920f0608..432e15ee5a 100755 Binary files a/openpilot/system/loggerd/encoderd and b/openpilot/system/loggerd/encoderd differ diff --git a/openpilot/system/loggerd/loggerd b/openpilot/system/loggerd/loggerd index 6ec436a275..c3eb886dd2 100755 Binary files a/openpilot/system/loggerd/loggerd and b/openpilot/system/loggerd/loggerd differ diff --git a/prebuilt.json b/prebuilt.json index 5bff31b079..9c1ea29355 100644 --- a/prebuilt.json +++ b/prebuilt.json @@ -1 +1 @@ -{"protected_inventory_sha256": "3558e76599ff3b45f976576887d3153afb93104366a64af0915af87031a9e15e", "schema_version": 1} +{"protected_inventory_sha256": "a346dbfe9f55c2e3f925d548396936928c6110131e2a08dfd2a0e13895343dbf", "schema_version": 1}