GB
Gabe Black (Gerrit)
Tue, Mar 21, 2023 10:53 PM
Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/69168?usp=email )
Change subject: mem: Use HostSocket in the SharedMemoryServer.
......................................................................
mem: Use HostSocket in the SharedMemoryServer.
Use a HostSocket parameter to accept connections, rather than a hand
implementation for unix domain sockets. This consolidates this code
with the code derived from it in ListenSocket, and also makes it
possible to connect to the SharedMemoryServer over an AF_INET socket.
Change-Id: I8e05434d08cffaebdf6c68a967e2ee7613c10a76
M src/mem/SharedMemoryServer.py
M src/mem/shared_memory_server.cc
M src/mem/shared_memory_server.hh
3 files changed, 9 insertions(+), 48 deletions(-)
diff --git a/src/mem/SharedMemoryServer.py b/src/mem/SharedMemoryServer.py
index 9700422..70a8923 100644
--- a/src/mem/SharedMemoryServer.py
+++ b/src/mem/SharedMemoryServer.py
@@ -12,6 +12,4 @@
Parent.any,
"The system where the target shared memory is actually stored.",
)
- server_path = Param.HostSocket("Socket path or port for the server.")
diff --git a/src/mem/shared_memory_server.cc
b/src/mem/shared_memory_server.cc
index 6344ee0..5787832 100644
--- a/src/mem/shared_memory_server.cc
+++ b/src/mem/shared_memory_server.cc
@@ -51,52 +51,18 @@
SharedMemoryServer::SharedMemoryServer(const SharedMemoryServerParams&
params)
: SimObject(params),
- // Create a new unix socket.
- serverFd = ListenSocket::socketCloexec(AF_UNIX, SOCK_STREAM, 0);
- panic_if(serverFd < 0, "%s: cannot create unix socket: %s", name(),
-
strerror(errno));
there's
be
-
// off.
-
bool old_sock_removed = unlink(serv_addr.sun_path) == 0;
-
warn_if(old_sock_removed,
-
"%s: server path %s was occupied and will be replaced.
Please "
-
"make sure there is no other server using the same path.",
-
name(), serv_addr.sun_path);
- }
- int bind_retv = bind(
-
serverFd, reinterpret_cast<const sockaddr*>(&serv_addr),
addr_size);
- listenSocketEvent.reset(new ListenSocketEvent(listener->getfd(),
this));
pollQueue.schedule(listenSocketEvent.get());
- inform("%s: listening at %s", name(), formatted_path);
- inform("%s: listening at %s", name(), *listener);
}
-SharedMemoryServer::~SharedMemoryServer()
-{
- if (!sockAddr.isAbstract) {
-
int unlink_retv = unlink(sockAddr.addr.sun_path);
-
warn_if(unlink_retv != 0, "%s: cannot unlink unix socket: %s",
name(),
-
strerror(errno));
- }
- int close_retv = close(serverFd);
- warn_if(close_retv != 0, "%s: cannot close unix socket: %s", name(),
-
strerror(errno));
-}
+SharedMemoryServer::~SharedMemoryServer() {}
SharedMemoryServer::BaseShmPollEvent::BaseShmPollEvent(
int fd, SharedMemoryServer* shm_server)
@@ -130,10 +96,7 @@
void
SharedMemoryServer::ListenSocketEvent::process(int revents)
{
- panic_if(revents & (POLLERR | POLLNVAL), "%s: listen socket is broken",
-
name());
- int cli_fd = ListenSocket::acceptCloexec(pfd.fd, nullptr, nullptr);
- panic_if(cli_fd < 0, "%s: accept failed: %s", name(), strerror(errno));
- int cli_fd = shmServer->listener->accept();
inform("%s: accept new connection %d", name(), cli_fd);
shmServer->clientSocketEvents[cli_fd].reset(
new ClientSocketEvent(cli_fd, shmServer));
diff --git a/src/mem/shared_memory_server.hh
b/src/mem/shared_memory_server.hh
index d9fbeb3..a4ef63d 100644
--- a/src/mem/shared_memory_server.hh
+++ b/src/mem/shared_memory_server.hh
@@ -83,10 +83,10 @@
void process(int revent) override;
};
--
To view, visit
https://gem5-review.googlesource.com/c/public/gem5/+/69168?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I8e05434d08cffaebdf6c68a967e2ee7613c10a76
Gerrit-Change-Number: 69168
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black gabe.black@gmail.com
Gerrit-CC: Gabe Black gabeblack@google.com
Gerrit-MessageType: newchange
Gabe Black has uploaded this change for review. (
https://gem5-review.googlesource.com/c/public/gem5/+/69168?usp=email )
Change subject: mem: Use HostSocket in the SharedMemoryServer.
......................................................................
mem: Use HostSocket in the SharedMemoryServer.
Use a HostSocket parameter to accept connections, rather than a hand
implementation for unix domain sockets. This consolidates this code
with the code derived from it in ListenSocket, and also makes it
possible to connect to the SharedMemoryServer over an AF_INET socket.
Change-Id: I8e05434d08cffaebdf6c68a967e2ee7613c10a76
---
M src/mem/SharedMemoryServer.py
M src/mem/shared_memory_server.cc
M src/mem/shared_memory_server.hh
3 files changed, 9 insertions(+), 48 deletions(-)
diff --git a/src/mem/SharedMemoryServer.py b/src/mem/SharedMemoryServer.py
index 9700422..70a8923 100644
--- a/src/mem/SharedMemoryServer.py
+++ b/src/mem/SharedMemoryServer.py
@@ -12,6 +12,4 @@
Parent.any,
"The system where the target shared memory is actually stored.",
)
- server_path = Param.String(
- "The unix socket path where the server should be running upon."
- )
+ server_path = Param.HostSocket("Socket path or port for the server.")
diff --git a/src/mem/shared_memory_server.cc
b/src/mem/shared_memory_server.cc
index 6344ee0..5787832 100644
--- a/src/mem/shared_memory_server.cc
+++ b/src/mem/shared_memory_server.cc
@@ -51,52 +51,18 @@
SharedMemoryServer::SharedMemoryServer(const SharedMemoryServerParams&
params)
: SimObject(params),
- sockAddr(UnixSocketAddr::build(params.server_path)),
system(params.system),
- serverFd(-1)
+ listener(params.server_path.build(name()))
{
fatal_if(system == nullptr, "Requires a system to share memory from!");
- // Create a new unix socket.
- serverFd = ListenSocket::socketCloexec(AF_UNIX, SOCK_STREAM, 0);
- panic_if(serverFd < 0, "%s: cannot create unix socket: %s", name(),
- strerror(errno));
+ listener->listen();
- const auto& [serv_addr, addr_size, is_abstract, formatted_path] =
sockAddr;
-
- if (!is_abstract) {
- // Ensure the unix socket path to use is not occupied. Also, if
there's
- // actually anything to be removed, warn the user something might
be
- // off.
- bool old_sock_removed = unlink(serv_addr.sun_path) == 0;
- warn_if(old_sock_removed,
- "%s: server path %s was occupied and will be replaced.
Please "
- "make sure there is no other server using the same path.",
- name(), serv_addr.sun_path);
- }
- int bind_retv = bind(
- serverFd, reinterpret_cast<const sockaddr*>(&serv_addr),
addr_size);
- fatal_if(bind_retv != 0, "%s: cannot bind unix socket '%s': %s",
name(),
- formatted_path, strerror(errno));
- // Start listening.
- int listen_retv = listen(serverFd, 1);
- fatal_if(listen_retv != 0, "%s: listen failed: %s", name(),
- strerror(errno));
- listenSocketEvent.reset(new ListenSocketEvent(serverFd, this));
+ listenSocketEvent.reset(new ListenSocketEvent(listener->getfd(),
this));
pollQueue.schedule(listenSocketEvent.get());
- inform("%s: listening at %s", name(), formatted_path);
+ inform("%s: listening at %s", name(), *listener);
}
-SharedMemoryServer::~SharedMemoryServer()
-{
- if (!sockAddr.isAbstract) {
- int unlink_retv = unlink(sockAddr.addr.sun_path);
- warn_if(unlink_retv != 0, "%s: cannot unlink unix socket: %s",
name(),
- strerror(errno));
- }
- int close_retv = close(serverFd);
- warn_if(close_retv != 0, "%s: cannot close unix socket: %s", name(),
- strerror(errno));
-}
+SharedMemoryServer::~SharedMemoryServer() {}
SharedMemoryServer::BaseShmPollEvent::BaseShmPollEvent(
int fd, SharedMemoryServer* shm_server)
@@ -130,10 +96,7 @@
void
SharedMemoryServer::ListenSocketEvent::process(int revents)
{
- panic_if(revents & (POLLERR | POLLNVAL), "%s: listen socket is broken",
- name());
- int cli_fd = ListenSocket::acceptCloexec(pfd.fd, nullptr, nullptr);
- panic_if(cli_fd < 0, "%s: accept failed: %s", name(), strerror(errno));
+ int cli_fd = shmServer->listener->accept();
inform("%s: accept new connection %d", name(), cli_fd);
shmServer->clientSocketEvents[cli_fd].reset(
new ClientSocketEvent(cli_fd, shmServer));
diff --git a/src/mem/shared_memory_server.hh
b/src/mem/shared_memory_server.hh
index d9fbeb3..a4ef63d 100644
--- a/src/mem/shared_memory_server.hh
+++ b/src/mem/shared_memory_server.hh
@@ -83,10 +83,10 @@
void process(int revent) override;
};
- UnixSocketAddr sockAddr;
System* system;
- int serverFd;
+ ListenSocketPtr listener;
+
std::unique_ptr<ListenSocketEvent> listenSocketEvent;
std::unordered_map<int, std::unique_ptr<ClientSocketEvent>>
clientSocketEvents;
--
To view, visit
https://gem5-review.googlesource.com/c/public/gem5/+/69168?usp=email
To unsubscribe, or for help writing mail filters, visit
https://gem5-review.googlesource.com/settings
Gerrit-Project: public/gem5
Gerrit-Branch: develop
Gerrit-Change-Id: I8e05434d08cffaebdf6c68a967e2ee7613c10a76
Gerrit-Change-Number: 69168
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.black@gmail.com>
Gerrit-CC: Gabe Black <gabeblack@google.com>
Gerrit-MessageType: newchange