From b6dcae31eea135249ca6025b60b1a07faf1356cd Mon Sep 17 00:00:00 2001 From: Jui-Min Lee Date: Wed, 6 Jul 2022 15:49:45 +0800 Subject: [PATCH] mem: multi-clients support for SharedMemoryServer Record the client session with a map instead of a single unique_ptr so our server can interact with multiple clients at once. This will also avoid a race condition case where the client thought it has closed previous connection and is trying to a new one while the server hasn't clean up the previous entry and raise a fatal error. Change-Id: Id08154fc4b54d2611629875b3f4e0d66c0e2ed92 Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/61049 Tested-by: kokoro Reviewed-by: Yu-hsin Wang Reviewed-by: Jason Lowe-Power Maintainer: Jason Lowe-Power --- src/mem/shared_memory_server.cc | 8 +++----- src/mem/shared_memory_server.hh | 4 +++- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/mem/shared_memory_server.cc b/src/mem/shared_memory_server.cc index 24dd9f6c88..ae5043f749 100644 --- a/src/mem/shared_memory_server.cc +++ b/src/mem/shared_memory_server.cc @@ -136,12 +136,10 @@ SharedMemoryServer::ListenSocketEvent::process(int revents) int cli_fd = ListenSocket::acceptCloexec(pfd.fd, nullptr, nullptr); panic_if(cli_fd < 0, "%s: accept failed: %s", name().c_str(), strerror(errno)); - panic_if(shmServer->clientSocketEvent.get(), - "%s: cannot serve two clients at once", name().c_str()); inform("%s: accept new connection %d", name().c_str(), cli_fd); - shmServer->clientSocketEvent.reset( + shmServer->clientSocketEvents[cli_fd].reset( new ClientSocketEvent(cli_fd, shmServer)); - pollQueue.schedule(shmServer->clientSocketEvent.get()); + pollQueue.schedule(shmServer->clientSocketEvents[cli_fd].get()); } void @@ -241,7 +239,7 @@ SharedMemoryServer::ClientSocketEvent::process(int revents) // somehow broken. We'll just close the connection and move on. inform("%s: closing connection", name().c_str()); close(pfd.fd); - shmServer->clientSocketEvent.reset(); + shmServer->clientSocketEvents.erase(pfd.fd); } } // namespace memory diff --git a/src/mem/shared_memory_server.hh b/src/mem/shared_memory_server.hh index 9102d74571..8f573fef3b 100644 --- a/src/mem/shared_memory_server.hh +++ b/src/mem/shared_memory_server.hh @@ -30,6 +30,7 @@ #include #include +#include #include "base/pollevent.hh" #include "params/SharedMemoryServer.hh" @@ -86,7 +87,8 @@ class SharedMemoryServer : public SimObject int serverFd; std::unique_ptr listenSocketEvent; - std::unique_ptr clientSocketEvent; + std::unordered_map> + clientSocketEvents; }; } // namespace memory