#include "base/tlsstream.hpp"
#include "base/utility.hpp"
#include "base/exception.hpp"
+#include "base/objectlock.hpp"
#include "base/logger_fwd.hpp"
#include <boost/bind.hpp>
#include <iostream>
}
void TlsStream::Write(const void *buffer, size_t count)
+{
+ {
+ ObjectLock olock(&m_SendQ);
+ m_SendQ.Write(buffer, count);
+ }
+
+ Utility::QueueAsyncCallback(boost::bind(&TlsStream::FinishAsyncWrite, this));
+}
+
+void TlsStream::FinishAsyncWrite(void)
+{
+ boost::mutex::scoped_lock lock(m_WriteMutex);
+
+ for (;;) {
+ ObjectLock olock(&m_SendQ);
+ char buffer[1024];
+ size_t count = m_SendQ.Read(buffer, sizeof(buffer));
+
+ if (count == 0)
+ break; /* No more data in the sendq */
+
+ WriteSync(buffer, count);
+ }
+}
+
+void TlsStream::WriteSync(const void *buffer, size_t count)
{
size_t left = count;
#include "base/i2-base.hpp"
#include "base/socket.hpp"
#include "base/stream.hpp"
+#include "base/fifo.hpp"
#include "base/tlsutility.hpp"
namespace icinga
virtual size_t Read(void *buffer, size_t count);
virtual void Write(const void *buffer, size_t count);
+ void WriteSync(const void *buffer, size_t count);
virtual bool IsEof(void) const;
boost::mutex m_SSLLock;
shared_ptr<SSL> m_SSL;
BIO *m_BIO;
+
+ boost::mutex m_WriteMutex;
+ FIFO m_SendQ;
Socket::Ptr m_Socket;
ConnectionRole m_Role;
static bool m_SSLIndexInitialized;
static void NullCertificateDeleter(X509 *certificate);
+
+ void FinishAsyncWrite(void);
};
}