]> granicus.if.org Git - icinga2/commitdiff
Improved FIFO performance
authorGunnar Beutner <gunnar.beutner@netways.de>
Wed, 28 Mar 2012 17:50:55 +0000 (19:50 +0200)
committerGunnar Beutner <gunnar.beutner@netways.de>
Wed, 28 Mar 2012 17:50:55 +0000 (19:50 +0200)
base/fifo.cpp
base/fifo.h
base/tcpclient.cpp
jsonrpc/netstring.cpp
miniapp/miniapp.cpp

index dcd05dabc6812c7dfb24a1f979ccd553d7d53a3d..fb75286fa856ee2e84721a07b10c084bd156aa65 100644 (file)
@@ -69,7 +69,7 @@ size_t FIFO::GetSize(void) const
        return m_BufferSize - m_Offset;
 }
 
-const void *FIFO::Peek(void) const
+const void *FIFO::GetReadBuffer(void) const
 {
        return m_Buffer + m_Offset;
 }
@@ -88,7 +88,7 @@ size_t FIFO::Read(void *buffer, size_t count)
        return count;
 }
 
-size_t FIFO::Write(const void *buffer, size_t count)
+void *FIFO::GetWriteBuffer(size_t count)
 {
        char *new_buffer;
 
@@ -98,7 +98,18 @@ size_t FIFO::Write(const void *buffer, size_t count)
                throw exception(/*"Out of memory."*/);
 
        m_Buffer = new_buffer;
-       memcpy(new_buffer + m_BufferSize + m_Offset, buffer, count);
+
+       return new_buffer + m_Offset + m_BufferSize;
+}
+
+size_t FIFO::Write(const void *buffer, size_t count)
+{
+       if (buffer != NULL) {
+               void *target_buffer = GetWriteBuffer(count);
+               memcpy(target_buffer, buffer, count);
+       }
+
        m_BufferSize += count;
+
        return count;
 }
index 2d9185e9fafce769ccbdffb0e844e0da7eb29fd4..03e8ee30d4a6e78cf4bc01850e84fec113b7d5bc 100644 (file)
@@ -7,7 +7,6 @@ namespace icinga
 class FIFO : public Object
 {
 private:
-       static const size_t BlockSize = 16 * 1024;
        char *m_Buffer;
        size_t m_BufferSize;
        size_t m_Offset;
@@ -16,6 +15,8 @@ private:
        void Optimize(void);
 
 public:
+       static const size_t BlockSize = 16 * 1024;
+
        typedef shared_ptr<FIFO> RefType;
        typedef weak_ptr<FIFO> WeakRefType;
 
@@ -24,7 +25,9 @@ public:
 
        size_t GetSize(void) const;
 
-       const void *Peek(void) const;
+       const void *GetReadBuffer(void) const;
+       void *GetWriteBuffer(size_t count);
+
        size_t Read(void *buffer, size_t count);
        size_t Write(const void *buffer, size_t count);
 };
index b8c5e1f608508cf923a0f5d42a39ad7a5e488219..ee0f00de8df87fb8d81cb5d37bdc765cb7a636cb 100644 (file)
@@ -31,13 +31,14 @@ FIFO::RefType TCPClient::GetRecvQueue(void)
 
 int TCPClient::ReadableEventHandler(EventArgs::RefType ea)
 {
-       char buffer[4096];
        int read_total, rc;
 
        read_total = 0;
 
        while (true) {
-               rc = recv(GetFD(), buffer, sizeof(buffer), 0);
+       static const size_t BufferSize = FIFO::BlockSize / 2;
+               char *buffer = (char *)m_RecvQueue->GetWriteBuffer(BufferSize);
+               rc = recv(GetFD(), buffer, BufferSize, 0);
 
 #ifdef _WIN32
                if (rc < 0 && WSAGetLastError() == WSAEWOULDBLOCK)
@@ -51,7 +52,7 @@ int TCPClient::ReadableEventHandler(EventArgs::RefType ea)
                        return 0;
                }
 
-               m_RecvQueue->Write(buffer, rc);
+               m_RecvQueue->Write(NULL, rc);
                read_total += rc;
 
                /* make sure we don't starve other sockets */
@@ -70,7 +71,7 @@ int TCPClient::WritableEventHandler(EventArgs::RefType ea)
 {
        int rc;
 
-       rc = send(GetFD(), (const char *)m_SendQueue->Peek(), m_SendQueue->GetSize(), 0);
+       rc = send(GetFD(), (const char *)m_SendQueue->GetReadBuffer(), m_SendQueue->GetSize(), 0);
 
        if (rc <= 0) {
                Close();
index 00b5636b1db7f376bfd5746e524477d99097e231..827aa76e4c272c60015c60b0cfd7564e7dac5465 100644 (file)
@@ -19,7 +19,7 @@ Netstring::~Netstring(void)
 Netstring::RefType Netstring::ReadFromFIFO(FIFO::RefType fifo)
 {
        size_t buffer_length = fifo->GetSize();
-       const char *buffer = (const char *)fifo->Peek();
+       const char *buffer = (const char *)fifo->GetReadBuffer();
 
        /* minimum netstring length is 3 */
        if (buffer_length < 3)
index 40a5e75ae8e742ec83f47a9f74f676f9170054e8..0a4524ef3ac95e6693bfa43d155b07cfa6f7a80c 100644 (file)
@@ -36,7 +36,7 @@ public:
 
                JsonRpcServer::RefType ts = new_object<JsonRpcServer>();
                ts->MakeSocket();
-               ts->Bind(9999);
+               ts->Bind(7777);
                ts->Listen();
 
                ConnectionManager::RefType cm = new_object<ConnectionManager>();