From 0f0b00dc1f56dbd380c989b3de8a3b5253efbb5f Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Sat, 3 Aug 2019 20:56:08 +0200 Subject: [PATCH] Lagom: Add a simple IPC client and server for host-side testing Add LibIPC to the Lagom build, and also implement two little test apps so we can run IPC tests on other systems. --- Lagom/CMakeLists.txt | 13 +++++++++++-- Lagom/SimpleIPC.ipc | 3 +++ Lagom/SimpleIPCClient.cpp | 39 ++++++++++++++++++++++++++++++++++++++ Lagom/SimpleIPCServer.cpp | 40 +++++++++++++++++++++++++++++++++++++++ 4 files changed, 93 insertions(+), 2 deletions(-) create mode 100644 Lagom/SimpleIPC.ipc create mode 100644 Lagom/SimpleIPCClient.cpp create mode 100644 Lagom/SimpleIPCServer.cpp diff --git a/Lagom/CMakeLists.txt b/Lagom/CMakeLists.txt index ac94f5ac772..33b7b8bb603 100644 --- a/Lagom/CMakeLists.txt +++ b/Lagom/CMakeLists.txt @@ -1,7 +1,7 @@ cmake_minimum_required (VERSION 3.0) project (Lagom) -set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wall -Wextra -Werror -std=c++17 -fPIC") +set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -O2 -Wall -Wextra -Werror -std=c++17 -fPIC -g") if ("${CMAKE_CXX_COMPILER_ID}" STREQUAL "Clang") set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} -Wconsumed") @@ -11,8 +11,9 @@ endif() file(GLOB AK_SOURCES "../AK/*.cpp") file(GLOB LIBCORE_SOURCES "../Libraries/LibCore/*.cpp") +file(GLOB LIBIPC_SOURCES "../Libraries/LibIPC/*.cpp") -set(SOURCES ${AK_SOURCES} ${LIBCORE_SOURCES}) +set(SOURCES ${AK_SOURCES} ${LIBCORE_SOURCES} ${LIBIPC_SOURCES}) include_directories (../) include_directories (../Libraries/) @@ -21,3 +22,11 @@ add_library(lagom ${SOURCES}) add_executable(TestApp TestApp.cpp) target_link_libraries(TestApp lagom) target_link_libraries(TestApp stdc++) + +add_executable(SimpleIPCClient SimpleIPCClient.cpp) +target_link_libraries(SimpleIPCClient lagom) +target_link_libraries(SimpleIPCClient stdc++) + +add_executable(SimpleIPCServer SimpleIPCServer.cpp) +target_link_libraries(SimpleIPCServer lagom) +target_link_libraries(SimpleIPCServer stdc++) diff --git a/Lagom/SimpleIPC.ipc b/Lagom/SimpleIPC.ipc new file mode 100644 index 00000000000..904314dc6cf --- /dev/null +++ b/Lagom/SimpleIPC.ipc @@ -0,0 +1,3 @@ +endpoint Simple { + ComputeSum(i32 a, i32 b, i32 c) => (i32 sum) +} diff --git a/Lagom/SimpleIPCClient.cpp b/Lagom/SimpleIPCClient.cpp new file mode 100644 index 00000000000..031cccf88d3 --- /dev/null +++ b/Lagom/SimpleIPCClient.cpp @@ -0,0 +1,39 @@ +#include +#include +#include +#include +#include "SimpleEndpoint.h" + +class SimpleIPCClient : public IPC::Client::ConnectionNG { + C_OBJECT(SimpleIPCClient) +public: + SimpleIPCClient() + : ConnectionNG("/tmp/simple-ipc") + {} + + virtual void handshake() override {} + + i32 compute_sum(i32 a, i32 b, i32 c) + { + return send_sync(a, b, c)->sum(); + } +}; + +int main(int, char**) +{ + CEventLoop event_loop; + + SimpleIPCClient client; + + CTimer timer(100, [&] { + i32 sum = client.compute_sum(1, 2, 3); + dbg() << "Sum: " << sum; + }); + + CTimer kill_timer(5000, [&] { + dbg() << "Timer fired, good-bye! :^)"; + event_loop.quit(0); + }); + + return event_loop.exec(); +} diff --git a/Lagom/SimpleIPCServer.cpp b/Lagom/SimpleIPCServer.cpp new file mode 100644 index 00000000000..3d4b5b69f1b --- /dev/null +++ b/Lagom/SimpleIPCServer.cpp @@ -0,0 +1,40 @@ +#include +#include +#include +#include +#include +#include "SimpleEndpoint.h" + +class SimpleIPCServer final : + public IPC::Server::ConnectionNG, + public SimpleEndpoint { + + C_OBJECT(SimpleIPCServer) +public: + SimpleIPCServer(CLocalSocket& socket, int client_id) + : ConnectionNG(*this, socket, client_id) + { + } + + virtual OwnPtr handle(const Simple::ComputeSum& message) + { + return make(message.a() + message.b() + message.c()); + } +}; + +int main(int, char**) +{ + CEventLoop event_loop; + + unlink("/tmp/simple-ipc"); + CLocalServer server_sock; + server_sock.listen("/tmp/simple-ipc"); + server_sock.on_ready_to_accept = [&] { + auto* client_socket = server_sock.accept(); + ASSERT(client_socket); + static int next_client_id = 0; + IPC::Server::new_connection_ng_for_client(*client_socket, ++next_client_id); + }; + + return event_loop.exec(); +}