Merge pull request #4 from orignal/master

Merge pull request from orignal/master
This commit is contained in:
chertov 2014-04-24 04:00:34 +04:00
commit a5776b064b
10 changed files with 80 additions and 22 deletions

View File

@ -33,7 +33,7 @@ namespace i2p
i2p::proxy::HTTPProxy *httpProxy;
};
Daemon_Singleton::Daemon_Singleton() : d(*new Daemon_Singleton_Private()), running(1) {};
Daemon_Singleton::Daemon_Singleton() : running(1), d(*new Daemon_Singleton_Private()) {};
Daemon_Singleton::~Daemon_Singleton() {
delete &d;
};

View File

@ -1,5 +1,4 @@
#include <boost/bind.hpp>
#include <boost/bind/protect.hpp>
#include <boost/lexical_cast.hpp>
#include "base64.h"
#include "Log.h"
@ -388,8 +387,8 @@ namespace util
{
if (m_Stream)
m_Stream->AsyncReceive (boost::asio::buffer (m_StreamBuffer, 8192),
boost::protect (boost::bind (&HTTPConnection::HandleStreamReceive, this,
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred)),
boost::bind (&HTTPConnection::HandleStreamReceive, this,
boost::asio::placeholders::error, boost::asio::placeholders::bytes_transferred),
45); // 45 seconds timeout
}

View File

@ -40,6 +40,12 @@ namespace data
return *this;
}
bool IdentHash::FromBase32(const std::string& s)
{
size_t count = Base32ToByteStream(s.c_str(), s.length(), m_Hash, sizeof(m_Hash));
return count == sizeof(m_Hash);
}
Keys CreateRandomKeys ()
{
Keys keys;

View File

@ -73,7 +73,9 @@ namespace data
bool operator== (const IdentHash& other) const { return !memcmp (m_Hash, other.m_Hash, 32); };
bool operator< (const IdentHash& other) const { return memcmp (m_Hash, other.m_Hash, 32) < 0; };
bool FromBase32(const std::string&);
private:
uint8_t m_Hash[32];
@ -106,7 +108,7 @@ namespace data
public:
RoutingDestination (): m_ElGamalEncryption (nullptr) {};
virtual ~RoutingDestination () { if (m_ElGamalEncryption) delete m_ElGamalEncryption; };
virtual ~RoutingDestination () { delete m_ElGamalEncryption; };
virtual const IdentHash& GetIdentHash () const = 0;
virtual const uint8_t * GetEncryptionPublicKey () const = 0;

15
Log.cpp
View File

@ -2,14 +2,19 @@
#include "Daemon.h"
i2p::util::MsgQueue<LogMsg> g_Log;
Log g_Log;
void LogMsg::Process()
{
if (Daemon.isLogging == 1 && Daemon.logfile.is_open())
{
Daemon.logfile << s.str();
Daemon.logfile.flush();
}
output << s.str();
}
}
void Log::Flush ()
{
if (Daemon.isLogging == 1 && Daemon.logfile.is_open())
Daemon.logfile.flush();
}

14
Log.h
View File

@ -3,6 +3,7 @@
#include <iostream>
#include <sstream>
#include <functional>
#include "Queue.h"
struct LogMsg
@ -15,7 +16,18 @@ struct LogMsg
void Process();
};
extern i2p::util::MsgQueue<LogMsg> g_Log;
class Log: public i2p::util::MsgQueue<LogMsg>
{
public:
Log () { SetOnEmpty (std::bind (&Log::Flush, this)); };
private:
void Flush ();
};
extern Log g_Log;
template<typename TValue>
void LogPrint (std::stringstream& s, TValue arg)

36
Queue.h
View File

@ -5,6 +5,7 @@
#include <mutex>
#include <thread>
#include <condition_variable>
#include <functional>
namespace i2p
{
@ -46,6 +47,12 @@ namespace util
return el;
}
void Wait ()
{
std::unique_lock<std::mutex> l(m_QueueMutex);
m_NonEmpty.wait (l);
}
bool Wait (int sec, int usec)
{
std::unique_lock<std::mutex> l(m_QueueMutex);
@ -98,27 +105,40 @@ namespace util
{
public:
MsgQueue (): m_Thread (std::bind (&MsgQueue<Msg>::Run, this)) , running(1) {};
typedef std::function<void()> OnEmpty;
MsgQueue (): m_IsRunning (true), m_Thread (std::bind (&MsgQueue<Msg>::Run, this)) {};
void Stop()
{
running = 0;
m_IsRunning = false;
Queue<Msg>::WakeUp ();
m_Thread.join();
}
void SetOnEmpty (OnEmpty const & e) { m_OnEmpty = e; };
private:
void Run ()
{
Msg * msg = nullptr;
while ((msg = Queue<Msg>::GetNext ()) != nullptr && running)
while (m_IsRunning)
{
msg->Process ();
delete msg;
while (Msg * msg = Queue<Msg>::Get ())
{
msg->Process ();
delete msg;
}
if (m_OnEmpty != nullptr)
m_OnEmpty ();
Queue<Msg>::Wait ();
}
}
private:
std::thread m_Thread;
volatile int running;
bool m_IsRunning;
std::thread m_Thread;
OnEmpty m_OnEmpty;
};
}
}

View File

@ -283,11 +283,13 @@ namespace stream
bool Stream::SendPacket (const uint8_t * buf, size_t len)
{
const I2NPMessage * leaseSet = nullptr;
if (m_LeaseSetUpdated)
{
leaseSet = m_LocalDestination->GetLeaseSet ();
m_LeaseSetUpdated = false;
}
I2NPMessage * msg = i2p::garlic::routing.WrapMessage (m_RemoteLeaseSet,
CreateDataMessage (this, buf, len), leaseSet);
if (!m_OutboundTunnel || m_OutboundTunnel->IsFailed ())

View File

@ -214,8 +214,8 @@ namespace stream
}
}
m_ReceiveTimer.expires_from_now (boost::posix_time::seconds(timeout));
m_ReceiveTimer.async_wait (boost::bind (&Stream::HandleReceiveTimer<Buffer, ReceiveHandler>,
this, boost::asio::placeholders::error, buffer, handler));
m_ReceiveTimer.async_wait ([=](const boost::system::error_code& ecode)
{ this->HandleReceiveTimer (ecode, buffer, handler); });
}
template<typename Buffer, typename ReceiveHandler>

View File

@ -21,6 +21,7 @@ set ( SOURCES
NTCPSession.cpp
RouterContext.cpp
SSU.cpp
SSUData.cpp
TransitTunnel.cpp
Tunnel.cpp
TunnelGateway.cpp
@ -37,6 +38,7 @@ set ( SOURCES
TunnelEndpoint.cpp
TunnelPool.cpp
util.cpp
Daemon.cpp
)
set ( HEADERS
@ -48,6 +50,7 @@ set ( HEADERS
NTCPSession.h
RouterContext.h
SSU.h
SSUData.h
TransitTunnel.h
Tunnel.h
TunnelGateway.h
@ -64,8 +67,17 @@ set ( HEADERS
TunnelEndpoint.h
TunnelPool.h
util.h
Daemon.h
)
if (WIN32)
list (APPEND SOURCES DeamonWin32.cpp)
else ()
list (APPEND SOURCES DaemonLinux.cpp)
endif ()
source_group ("Header Files" FILES ${HEADERS})
source_group ("Source Files" FILES ${SOURCES})