Gabe Black has uploaded this change for review. ( https://gem5-review.googlesource.com/c/public/gem5/+/69163?usp=email )

Change subject: base: Abstract the AF_INET-ness out of ListenSocket.
......................................................................

base: Abstract the AF_INET-ness out of ListenSocket.

Put them into a subclass called ListenSocketInet.

Change-Id: I035621463a7f799c1d36a500ed933dc056238e5e
---
M src/base/socket.cc
M src/base/socket.hh
M src/base/socket.test.cc
3 files changed, 67 insertions(+), 45 deletions(-)



diff --git a/src/base/socket.cc b/src/base/socket.cc
index 5fb8492..0324788 100644
--- a/src/base/socket.cc
+++ b/src/base/socket.cc
@@ -173,11 +173,7 @@
 //
 //

-ListenSocket::ListenSocket(const std::string &_name, int port)
-    : Named(_name), listening(false), fd(-1), _port(port)
-{}
-
-ListenSocket::ListenSocket() : ListenSocket("<unnammed>", -1) {}
+ListenSocket::ListenSocket(const std::string &_name) : Named(_name) {}

 ListenSocket::~ListenSocket()
 {
@@ -185,9 +181,41 @@
         close(fd);
 }

+// Open a connection.  Accept will block, so if you don't want it to,
+// make sure a connection is ready before you call accept.
+int
+ListenSocket::accept()
+{
+    struct sockaddr_in sockaddr;
+    socklen_t slen = sizeof (sockaddr);
+    int sfd = acceptCloexec(fd, (struct sockaddr *)&sockaddr, &slen);
+    if (sfd == -1)
+        return -1;
+
+    return sfd;
+}
+
+ListenSocketInet::ListenSocketInet(const std::string &_name, int port)
+    : ListenSocket(_name), _port(port)
+{}
+
+int
+ListenSocketInet::accept()
+{
+    int sfd = ListenSocket::accept();
+    if (sfd == -1)
+        return -1;
+
+    int i = 1;
+    int ret = ::setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, &i, sizeof(i));
+ warn_if(ret < 0, "ListenSocket(accept): setsockopt() TCP_NODELAY failed!");
+
+    return sfd;
+}
+
 // Create a socket and configure it for listening
 bool
-ListenSocket::listen(int port)
+ListenSocketInet::listen(int port)
 {
     panic_if(listening, "Socket already listening!");

@@ -234,7 +262,7 @@
 }

 void
-ListenSocket::listen()
+ListenSocketInet::listen()
 {
     while (!listen(_port)) {
         _port++;
@@ -245,35 +273,16 @@
 }

 void
-ListenSocket::output(std::ostream &os) const
+ListenSocketInet::output(std::ostream &os) const
 {
     os << "port " << _port;
 }

-
-// Open a connection.  Accept will block, so if you don't want it to,
-// make sure a connection is ready before you call accept.
-int
-ListenSocket::accept()
-{
-    struct sockaddr_in sockaddr;
-    socklen_t slen = sizeof (sockaddr);
-    int sfd = acceptCloexec(fd, (struct sockaddr *)&sockaddr, &slen);
-    if (sfd == -1)
-        return -1;
-
-    int i = 1;
-    int ret = ::setsockopt(sfd, IPPROTO_TCP, TCP_NODELAY, &i, sizeof(i));
- warn_if(ret < 0, "ListenSocket(accept): setsockopt() TCP_NODELAY failed!");
-
-    return sfd;
-}
-
 ListenSocketConfig
 listenSocketInetConfig(int port)
 {
     return ListenSocketConfig([port](const std::string &name) {
-        return std::make_unique<ListenSocket>(name, port);
+        return std::make_unique<ListenSocketInet>(name, port);
     });
 }

diff --git a/src/base/socket.hh b/src/base/socket.hh
index 638ce40..e233d85 100644
--- a/src/base/socket.hh
+++ b/src/base/socket.hh
@@ -93,31 +93,27 @@
     static void loopbackOnly();

   protected:
-    bool listening;
-    int fd;
-    int _port;
+    bool listening = false;
+    int fd = -1;

     /*
      * cleanup resets the static variables back to their default values.
      */
     static void cleanup();

-    virtual bool listen(int port);
+    ListenSocket(const std::string &_name);

   public:
     /**
      * @ingroup api_socket
      * @{
      */
-    ListenSocket(const std::string &_name, int port);
-    ListenSocket();
     virtual ~ListenSocket();

     virtual int accept();
+    virtual void listen() = 0;

-    virtual void listen();
-
-    virtual void output(std::ostream &os) const;
+    virtual void output(std::ostream &os) const = 0;

     int getfd() const { return fd; }
     bool islistening() const { return listening; }
@@ -130,6 +126,13 @@
     /** @} */ // end of api_socket
 };

+inline static std::ostream &
+operator << (std::ostream &os, const ListenSocket &socket)
+{
+    socket.output(os);
+    return os;
+}
+
 using ListenSocketPtr = std::unique_ptr<ListenSocket>;

 class ListenSocketConfig
@@ -155,14 +158,24 @@

 static inline ListenSocketConfig listenSocketEmptyConfig() { return {}; }

-ListenSocketConfig listenSocketInetConfig(int port);
+// AF_INET based sockets.

-inline static std::ostream &
-operator << (std::ostream &os, const ListenSocket &socket)
+class ListenSocketInet : public ListenSocket
 {
-    socket.output(os);
-    return os;
-}
+  protected:
+    int _port;
+
+    virtual bool listen(int port);
+
+  public:
+    ListenSocketInet(const std::string &_name, int port);
+
+    int accept() override;
+    void listen() override;
+    void output(std::ostream &os) const override;
+};
+
+ListenSocketConfig listenSocketInetConfig(int port);

 } // namespace gem5

diff --git a/src/base/socket.test.cc b/src/base/socket.test.cc
index 8e1c25b..0f0de54 100644
--- a/src/base/socket.test.cc
+++ b/src/base/socket.test.cc
@@ -118,10 +118,10 @@
     EXPECT_EQ(truncated_addr, sock_addr.formattedPath);
 }

-class MockListenSocket : public ListenSocket
+class MockListenSocket : public ListenSocketInet
 {
   public:
-    MockListenSocket(int port) : ListenSocket("mock", port) {}
+    MockListenSocket(int port) : ListenSocketInet("mock", port) {}
     /*
* This mock Listen Socket is used to ensure the static variables are reset * back to their default values after deconstruction (i.e., after a test

--
To view, visit https://gem5-review.googlesource.com/c/public/gem5/+/69163?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: I035621463a7f799c1d36a500ed933dc056238e5e
Gerrit-Change-Number: 69163
Gerrit-PatchSet: 1
Gerrit-Owner: Gabe Black <gabe.bl...@gmail.com>
Gerrit-CC: Gabe Black <gabebl...@google.com>
Gerrit-MessageType: newchange
_______________________________________________
gem5-dev mailing list -- gem5-dev@gem5.org
To unsubscribe send an email to gem5-dev-le...@gem5.org

Reply via email to