]> granicus.if.org Git - icinga2/commitdiff
Keep track of whether sockets are connected.
authorGunnar Beutner <gunnar.beutner@netways.de>
Mon, 16 Jul 2012 09:15:20 +0000 (11:15 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Mon, 16 Jul 2012 09:15:20 +0000 (11:15 +0200)
base/socket.cpp
base/socket.h
base/tcpclient.cpp

index fb25499351badd00115c09cc8e513278b1684d5d..810ce314bced3144d30e495b3dd90206df4a510c 100644 (file)
@@ -25,9 +25,8 @@ using namespace icinga;
  * Constructor for the Socket class.
  */
 Socket::Socket(void)
-{
-       m_FD = INVALID_SOCKET;
-}
+       : m_FD(INVALID_SOCKET), m_Connected(false)
+{ }
 
 /**
  * Destructor for the Socket class.
@@ -317,8 +316,12 @@ void Socket::ReadThreadProc(void)
                        return;
                }
 
-               if (FD_ISSET(fd, &readfds))
+               if (FD_ISSET(fd, &readfds)) {
+                       if (!m_Connected)
+                               m_Connected = true;
+
                        HandleReadable();
+               }
 
                if (FD_ISSET(fd, &exceptfds))
                        HandleException();
@@ -337,7 +340,7 @@ void Socket::WriteThreadProc(void)
 
                FD_ZERO(&writefds);
 
-               while (!WantsToWrite()) {
+               while (!WantsToWrite() && m_Connected) {
                        m_WriteCV.timed_wait(lock, boost::posix_time::seconds(1));
 
                        if (GetFD() == INVALID_SOCKET)
@@ -365,8 +368,12 @@ void Socket::WriteThreadProc(void)
                        return;
                }
 
-               if (FD_ISSET(fd, &writefds))
+               if (FD_ISSET(fd, &writefds)) {
+                       if (!m_Connected)
+                               m_Connected = true;
+
                        HandleWritable();
+               }
        }
 }
 
index 5b437f253c7983ff59878c91f4bdf1cbdf29d27b..e046f5a29a9ba60bcc4f20aa0dbcbb878dafa899 100644 (file)
@@ -70,6 +70,7 @@ protected:
 
 private:
        SOCKET m_FD; /**< The socket descriptor. */
+       bool m_Connected;
 
        thread m_ReadThread;
        thread m_WriteThread;
index fcfdb233db20cbf5506d2c7b6717142eb38d8451..ce9c89a423dd64f58d683b4ac7787d98357ab892 100644 (file)
@@ -27,12 +27,9 @@ using namespace icinga;
  * @param role The role of the TCP client socket.
  */
 TcpClient::TcpClient(TcpClientRole role)
-{
-       m_Role = role;
-
-       m_SendQueue = boost::make_shared<FIFO>();
-       m_RecvQueue = boost::make_shared<FIFO>();
-}
+       : m_Role(role), m_SendQueue(boost::make_shared<FIFO>()),
+         m_RecvQueue(boost::make_shared<FIFO>())
+{ }
 
 /**
  * Retrieves the role of the socket.