mirror of
https://github.com/PurpleI2P/i2pd
synced 2024-11-10 00:00:29 +03:00
implement AcceptOnce for multiple acceptors
This commit is contained in:
parent
573ee0b584
commit
88a48a5c79
@ -1037,6 +1037,29 @@ namespace stream
|
||||
m_Acceptor = nullptr;
|
||||
}
|
||||
|
||||
void StreamingDestination::AcceptOnce (const Acceptor& acceptor)
|
||||
{
|
||||
m_Owner->GetService ().post([acceptor, this](void)
|
||||
{
|
||||
if (!m_PendingIncomingStreams.empty ())
|
||||
{
|
||||
acceptor (m_PendingIncomingStreams.front ());
|
||||
m_PendingIncomingStreams.pop_front ();
|
||||
if (m_PendingIncomingStreams.empty ())
|
||||
m_PendingIncomingTimer.cancel ();
|
||||
}
|
||||
else // we must save old acceptor and set it back
|
||||
{
|
||||
auto oldAcceptor = m_Acceptor;
|
||||
m_Acceptor = [acceptor, oldAcceptor, this](std::shared_ptr<Stream> stream)
|
||||
{
|
||||
acceptor (stream);
|
||||
m_Acceptor = oldAcceptor;
|
||||
};
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
void StreamingDestination::HandlePendingIncomingTimer (const boost::system::error_code& ecode)
|
||||
{
|
||||
if (ecode != boost::asio::error::operation_aborted)
|
||||
|
@ -223,6 +223,8 @@ namespace stream
|
||||
void SetAcceptor (const Acceptor& acceptor);
|
||||
void ResetAcceptor ();
|
||||
bool IsAcceptorSet () const { return m_Acceptor != nullptr; };
|
||||
void AcceptOnce (const Acceptor& acceptor);
|
||||
|
||||
std::shared_ptr<i2p::client::ClientDestination> GetOwner () const { return m_Owner; };
|
||||
void SetOwner (std::shared_ptr<i2p::client::ClientDestination> owner) { m_Owner = owner; };
|
||||
uint16_t GetLocalPort () const { return m_LocalPort; };
|
||||
|
Loading…
Reference in New Issue
Block a user