Refactor IORedirectServer
authorIgor Kulaychuk <i.kulaychuk@samsung.com>
Fri, 25 May 2018 19:43:25 +0000 (22:43 +0300)
committerIgor Kulaychuk <i.kulaychuk@samsung.com>
Tue, 5 Jun 2018 15:08:24 +0000 (18:08 +0300)
src/debug/netcoredbg/platform.cpp
src/debug/netcoredbg/platform.h

index 375e6469df0e7adf47864f23e16b6b867e0a6a5a..330d50171a002c6ac8054a26887c622a68f18282 100644 (file)
@@ -294,28 +294,49 @@ IORedirectServer::IORedirectServer(
     m_appStdIn(-1)
 {
     RedirectOutput(onStdOut, onStdErr);
+    int fd = WaitForConnection(port);
 
+    if (fd != -1)
+    {
+        m_in = new fdbuf(fd);
+        m_out = new fdbuf(fd);
+    }
+    else
+    {
+        m_in = new fdbuf(m_realStdInFd);
+        m_out = new fdbuf(m_realStdOutFd);
+    }
+    m_err = new fdbuf(m_realStdErrFd);
+
+    m_prevIn = std::cin.rdbuf();
+    m_prevOut = std::cout.rdbuf();
+    m_prevErr = std::cerr.rdbuf();
+
+    std::cin.rdbuf(m_in);
+    std::cout.rdbuf(m_out);
+    std::cerr.rdbuf(m_err);
+}
+
+int IORedirectServer::WaitForConnection(uint16_t port)
+{
     int newsockfd;
     socklen_t clilen;
     struct sockaddr_in serv_addr, cli_addr;
     int n;
 
-    m_prevIn = std::cin.rdbuf();
-    m_prevOut = std::cout.rdbuf();
-
     if (port == 0)
-        return;
+        return -1;
 
     m_sockfd = ::socket(AF_INET, SOCK_STREAM, 0);
     if (m_sockfd < 0)
-        return;
+        return -1;
 
     int enable = 1;
     if (setsockopt(m_sockfd, SOL_SOCKET, SO_REUSEADDR, &enable, sizeof(int)) < 0)
     {
         ::close(m_sockfd);
         m_sockfd = -1;
-        return;
+        return -1;
     }
     memset(&serv_addr, 0, sizeof(serv_addr));
 
@@ -327,11 +348,14 @@ IORedirectServer::IORedirectServer(
     {
         ::close(m_sockfd);
         m_sockfd = -1;
-        return;
+        return -1;
     }
 
     ::listen(m_sockfd, 5);
 
+    // On Tizen, launch_app won't terminate until stdin, stdout and stderr are closed.
+    // But Visual Studio initiates the connection only after launch_app termination,
+    // therefore we need to close the descriptors before the call to accept().
     close(m_realStdInFd);
     close(m_realStdOutFd);
     close(m_realStdErrFd);
@@ -345,22 +369,20 @@ IORedirectServer::IORedirectServer(
     {
         ::close(m_sockfd);
         m_sockfd = -1;
-        return;
+        return -1;
     }
 
-    m_in = new fdbuf(newsockfd);
-    m_out = new fdbuf(newsockfd);
-
-    std::cin.rdbuf(m_in);
-    std::cout.rdbuf(m_out);
+    return newsockfd;
 }
 
 IORedirectServer::~IORedirectServer()
 {
     std::cin.rdbuf(m_prevIn);
     std::cout.rdbuf(m_prevOut);
+    std::cout.rdbuf(m_prevErr);
     delete m_in;
     delete m_out;
+    delete m_err;
     ::close(m_sockfd);
 }
 
@@ -392,10 +414,6 @@ void IORedirectServer::RedirectOutput(std::function<void(std::string)> onStdOut,
     m_realStdOutFd = dup(STDOUT_FILENO);
     m_realStdErrFd = dup(STDERR_FILENO);
 
-    std::cin.rdbuf(new fdbuf(m_realStdInFd));
-    std::cout.rdbuf(new fdbuf(m_realStdOutFd));
-    std::cerr.rdbuf(new fdbuf(m_realStdErrFd));
-
     int inPipe[2];
     int outPipe[2];
     int errPipe[2];
index 336f6f4db19e33bf9bd0e59c4b299f4eec134c09..b77fde50dfea7cfcfed207c2006363b79c57d540 100644 (file)
@@ -21,16 +21,20 @@ class IORedirectServer
 {
     std::streambuf *m_in;
     std::streambuf *m_out;
+    std::streambuf *m_err;
     std::streambuf *m_prevIn;
     std::streambuf *m_prevOut;
+    std::streambuf *m_prevErr;
     int m_sockfd;
     int m_realStdInFd;
     int m_realStdOutFd;
     int m_realStdErrFd;
     int m_appStdIn;
+
     void RedirectOutput(
         std::function<void(std::string)> onStdOut,
         std::function<void(std::string)> onStdErr);
+    int WaitForConnection(uint16_t port);
 public:
     IORedirectServer(
         uint16_t port,