base: avoid recreating socket at each call to listen()
authorNathanael Premillieu <nathanael.premillieu@huawei.com>
Thu, 13 Aug 2020 14:10:57 +0000 (16:10 +0200)
committerNathanael Premillieu <nathanael.premillieu@huawei.com>
Mon, 31 Aug 2020 07:36:24 +0000 (07:36 +0000)
A new socket was created each time listen() is called,
which is problematic when the bind or listen operation
on it are not successful (mostly because the associated port is
already in use). It can lead gem5 to open too many files and crash
for multicores configurations, a socket being created
for remote GDB for each core. The other way to deal with
this problem would be to close the socket in the case the
function return false. But I find the proposed solution
simpler.

Change-Id: I848955a10c89e1da033bf773c83556a5dc5ef9a2
Reviewed-on: https://gem5-review.googlesource.com/c/public/gem5/+/32994
Reviewed-by: Gabe Black <gabeblack@google.com>
Maintainer: Gabe Black <gabeblack@google.com>
Tested-by: kokoro <noreply+kokoro@google.com>
src/base/socket.cc

index adf83150384e05e0e52e2102a63b69d14a19b64f..fce54aa76d939ad1964fea14d087b8e5bfccf5ec 100644 (file)
@@ -101,9 +101,12 @@ ListenSocket::listen(int port, bool reuse)
     if (listening)
         panic("Socket already listening!");
 
-    fd = ::socket(PF_INET, SOCK_STREAM, 0);
-    if (fd < 0)
-        panic("Can't create socket:%s !", strerror(errno));
+    // only create socket if not already created by a previous call
+    if (fd == -1) {
+        fd = ::socket(PF_INET, SOCK_STREAM, 0);
+        if (fd < 0)
+            panic("Can't create socket:%s !", strerror(errno));
+    }
 
     if (reuse) {
         int i = 1;