From 7e393e01dae4bf6691925f1f87a8dd6c662e678e Mon Sep 17 00:00:00 2001 From: Desour Date: Sun, 6 Oct 2024 15:45:15 +0200 Subject: [PATCH] use string_view? --- src/benchmark/benchmark_ipc_channel.cpp | 16 ++++++------- src/threading/ipc_channel.cpp | 25 +++++++++++--------- src/threading/ipc_channel.h | 31 ++++++++++++------------- src/unittest/test_threading.cpp | 16 ++++++------- 4 files changed, 45 insertions(+), 43 deletions(-) diff --git a/src/benchmark/benchmark_ipc_channel.cpp b/src/benchmark/benchmark_ipc_channel.cpp index e81f55cf4..2340d8147 100644 --- a/src/benchmark/benchmark_ipc_channel.cpp +++ b/src/benchmark/benchmark_ipc_channel.cpp @@ -27,8 +27,8 @@ TEST_CASE("benchmark_ipc_channel") // echos back messages. stops if "" is sent for (;;) { end_b.recv(); - end_b.send(end_b.getRecvData(), end_b.getRecvSize()); - if (end_b.getRecvSize() == 0) + end_b.send(end_b.getRecvData()); + if (end_b.getRecvData().size() == 0) break; } }); @@ -39,8 +39,8 @@ TEST_CASE("benchmark_ipc_channel") BENCHMARK("simple_call_1", i) { char buf[16] = {}; buf[i & 0xf] = i; - end_a.exchange(buf, 16); - return reinterpret_cast(end_a.getRecvData())[i & 0xf]; + end_a.exchange({buf, 16}); + return end_a.getRecvData()[i & 0xf]; }; BENCHMARK("simple_call_1000", i) { @@ -48,14 +48,14 @@ TEST_CASE("benchmark_ipc_channel") buf[i & 0xf] = i; for (int k = 0; k < 1000; ++k) { buf[0] = k & 0xff; - end_a.exchange(buf, 16); + end_a.exchange({buf, 16}); } - return reinterpret_cast(end_a.getRecvData())[i & 0xf]; + return end_a.getRecvData()[i & 0xf]; }; // stop thread_b - end_a.exchange(nullptr, 0); - REQUIRE(end_a.getRecvSize() == 0); + end_a.exchange({nullptr, 0}); + REQUIRE(end_a.getRecvData().size() == 0); thread_b.join(); } diff --git a/src/threading/ipc_channel.cpp b/src/threading/ipc_channel.cpp index 59b90c4f5..d053161c5 100644 --- a/src/threading/ipc_channel.cpp +++ b/src/threading/ipc_channel.cpp @@ -278,35 +278,38 @@ IPCChannelEnd IPCChannelEnd::makeB(std::unique_ptr resource #endif // !defined(IPC_CHANNEL_IMPLEMENTATION_WIN32) } -void IPCChannelEnd::sendSmall(const void *data, size_t size) noexcept +void IPCChannelEnd::sendSmall(std::string_view data) noexcept { - write_once(&m_dir.buf_out->size, size); + write_once(&m_dir.buf_out->size, data.size()); - if (size != 0) - memcpy(m_dir.buf_out->data, data, size); + if (data.size() != 0) + memcpy(m_dir.buf_out->data, data.data(), data.size()); post_out(&m_dir); } -bool IPCChannelEnd::sendLarge(const void *data, size_t size, int timeout_ms) noexcept +bool IPCChannelEnd::sendLarge(std::string_view data, int timeout_ms) noexcept { u64 timeout_ms_abs = timeout_ms < 0 ? 0 : porting::getTimeMs() + timeout_ms; - write_once(&m_dir.buf_out->size, size); + write_once(&m_dir.buf_out->size, data.size()); - do { - memcpy(m_dir.buf_out->data, data, IPC_CHANNEL_MSG_SIZE); + size_t size = data.size(); + const u8 *ptr = reinterpret_cast(data.data()); + + while (size > IPC_CHANNEL_MSG_SIZE) { + memcpy(m_dir.buf_out->data, ptr, IPC_CHANNEL_MSG_SIZE); post_out(&m_dir); if (!wait_in(&m_dir, timeout_ms_abs)) return false; size -= IPC_CHANNEL_MSG_SIZE; - data = (u8 *)data + IPC_CHANNEL_MSG_SIZE; - } while (size > IPC_CHANNEL_MSG_SIZE); + ptr = ptr + IPC_CHANNEL_MSG_SIZE; + } if (size != 0) - memcpy(m_dir.buf_out->data, data, size); + memcpy(m_dir.buf_out->data, ptr, size); post_out(&m_dir); return true; diff --git a/src/threading/ipc_channel.h b/src/threading/ipc_channel.h index 0cd8b4962..2d8e1a689 100644 --- a/src/threading/ipc_channel.h +++ b/src/threading/ipc_channel.h @@ -27,6 +27,7 @@ with this program; if not, write to the Free Software Foundation, Inc., #include #include #include +#include #if defined(_WIN32) #define IPC_CHANNEL_IMPLEMENTATION_WIN32 @@ -193,20 +194,20 @@ public: // Returns false on timeout [[nodiscard]] - bool sendWithTimeout(const void *data, size_t size, int timeout_ms) noexcept + bool sendWithTimeout(std::string_view data, int timeout_ms) noexcept { - if (size <= IPC_CHANNEL_MSG_SIZE) { - sendSmall(data, size); + if (data.size() <= IPC_CHANNEL_MSG_SIZE) { + sendSmall(data); return true; } else { - return sendLarge(data, size, timeout_ms); + return sendLarge(data, timeout_ms); } } // Same as above - void send(const void *data, size_t size) noexcept + void send(std::string_view data) noexcept { - (void)sendWithTimeout(data, size, -1); + (void)sendWithTimeout(data, -1); } // Returns false on timeout. @@ -223,33 +224,31 @@ public: // Returns false on timeout // Otherwise returns true, and data is available via getRecvData(). [[nodiscard]] - bool exchangeWithTimeout(const void *data, size_t size, int timeout_ms) noexcept + bool exchangeWithTimeout(std::string_view data, int timeout_ms) noexcept { - return sendWithTimeout(data, size, timeout_ms) + return sendWithTimeout(data, timeout_ms) && recvWithTimeout(timeout_ms); } // Same as above - void exchange(const void *data, size_t size) noexcept + void exchange(std::string_view data) noexcept { - (void)exchangeWithTimeout(data, size, -1); + (void)exchangeWithTimeout(data, -1); } // Get the content of the last received message - // TODO: u8 *, or string_view? - const void *getRecvData() const noexcept { return m_large_recv.data(); } - size_t getRecvSize() const noexcept { return m_recv_size; } + std::string_view getRecvData() const noexcept + { return {reinterpret_cast(m_large_recv.data()), m_recv_size}; } private: IPCChannelEnd(std::unique_ptr resources, Dir dir) : m_resources(std::move(resources)), m_dir(dir) {} - // TODO: u8 *, or string_view? - void sendSmall(const void *data, size_t size) noexcept; + void sendSmall(std::string_view data) noexcept; // returns false on timeout - bool sendLarge(const void *data, size_t size, int timeout_ms) noexcept; + bool sendLarge(std::string_view data, int timeout_ms) noexcept; std::unique_ptr m_resources; Dir m_dir; diff --git a/src/unittest/test_threading.cpp b/src/unittest/test_threading.cpp index 7db619b04..a2e1298bb 100644 --- a/src/unittest/test_threading.cpp +++ b/src/unittest/test_threading.cpp @@ -237,8 +237,8 @@ void TestThreading::testIPCChannel() // echos back messages. stops if "" is sent for (;;) { UASSERT(end_b.recvWithTimeout(-1)); - UASSERT(end_b.sendWithTimeout(end_b.getRecvData(), end_b.getRecvSize(), -1)); - if (end_b.getRecvSize() == 0) + UASSERT(end_b.sendWithTimeout(end_b.getRecvData(), -1)); + if (end_b.getRecvData().size() == 0) break; } }); @@ -246,17 +246,17 @@ void TestThreading::testIPCChannel() char buf[20000] = {}; for (int i = sizeof(buf); i > 0; i -= 100) { buf[i - 1] = 123; - UASSERT(end_a.exchangeWithTimeout(buf, i, -1)); - UASSERTEQ(int, end_a.getRecvSize(), i); - UASSERTEQ(int, ((const char *)end_a.getRecvData())[i - 1], 123); + UASSERT(end_a.exchangeWithTimeout({buf, (size_t)i}, -1)); + UASSERTEQ(int, end_a.getRecvData().size(), i); + UASSERTEQ(int, end_a.getRecvData().data()[i - 1], 123); } // stop thread_b - UASSERT(end_a.exchangeWithTimeout(buf, 0, -1)); - UASSERTEQ(int, end_a.getRecvSize(), 0); + UASSERT(end_a.exchangeWithTimeout({buf, 0}, -1)); + UASSERTEQ(int, end_a.getRecvData().size(), 0); thread_b.join(); // other side dead ==> should time out - UASSERT(!end_a.exchangeWithTimeout(buf, 0, 200)); + UASSERT(!end_a.exchangeWithTimeout({buf, 0}, 200)); }