@ -7,8 +7,7 @@
namespace libuv
{
# define LoopCall(h, ...) \
LogicCall ( static_cast < Loop * > ( ( h ) - > loop - > data ) - > m_Logic , __VA_ARGS__ )
# define LoopCall(h, ...) LogicCall(static_cast<Loop*>((h)->loop->data)->m_Logic, __VA_ARGS__)
struct glue
{
@ -20,7 +19,7 @@ namespace libuv
/// tcp connection glue between llarp and libuv
struct conn_glue : public glue
{
using WriteBuffer_t = std : : vector < char > ;
using WriteBuffer_t = std : : vector < char > ;
struct WriteEvent
{
@ -98,7 +97,7 @@ namespace libuv
static void
OnOutboundConnect ( uv_connect_t * c , int status )
{
conn_glue * self = static_cast < conn_glue * > ( c - > data ) ;
conn_glue * self = static_cast < conn_glue * > ( c - > data ) ;
self - > HandleConnectResult ( status ) ;
c - > data = nullptr ;
}
@ -106,38 +105,37 @@ namespace libuv
bool
ConnectAsync ( )
{
return uv_tcp_connect ( & m_Connect , & m_Handle , m_Addr , & OnOutboundConnect )
! = - 1 ;
return uv_tcp_connect ( & m_Connect , & m_Handle , m_Addr , & OnOutboundConnect ) ! = - 1 ;
}
static void
ExplicitClose ( llarp_tcp_conn * conn )
{
static_cast < conn_glue * > ( conn - > impl ) - > Close ( ) ;
static_cast < conn_glue * > ( conn - > impl ) - > Close ( ) ;
}
static void
ExplicitCloseAccept ( llarp_tcp_acceptor * tcp )
{
static_cast < conn_glue * > ( tcp - > impl ) - > Close ( ) ;
static_cast < conn_glue * > ( tcp - > impl ) - > Close ( ) ;
}
static ssize_t
ExplicitWrite ( llarp_tcp_conn * conn , const byte_t * ptr , size_t sz )
{
return static_cast < conn_glue * > ( conn - > impl ) - > WriteAsync ( ( char * ) ptr , sz ) ;
return static_cast < conn_glue * > ( conn - > impl ) - > WriteAsync ( ( char * ) ptr , sz ) ;
}
static void
OnRead ( uv_stream_t * stream , ssize_t nread , const uv_buf_t * buf )
{
if ( nread > = 0 )
if ( nread > = 0 )
{
auto * conn = static_cast < conn_glue * > ( stream - > data ) ;
auto * conn = static_cast < conn_glue * > ( stream - > data ) ;
conn - > Read ( buf - > base , nread ) ;
}
else if ( nread < 0 )
else if ( nread < 0 )
{
static_cast < conn_glue * > ( stream - > data ) - > Close ( ) ;
static_cast < conn_glue * > ( stream - > data ) - > Close ( ) ;
}
delete [ ] buf - > base ;
}
@ -152,7 +150,7 @@ namespace libuv
void
Read ( const char * ptr , ssize_t sz )
{
if ( m_Conn . read )
if ( m_Conn . read )
{
llarp : : LogDebug ( " tcp read " , sz , " bytes " ) ;
const llarp_buffer_t buf ( ptr , sz ) ;
@ -163,9 +161,9 @@ namespace libuv
void
HandleConnectResult ( int status )
{
if ( m_TCP & & m_TCP - > connected )
if ( m_TCP & & m_TCP - > connected )
{
if ( status = = 0 )
if ( status = = 0 )
{
m_Conn . impl = this ;
m_Conn . loop = m_TCP - > loop ;
@ -174,7 +172,7 @@ namespace libuv
m_TCP - > connected ( m_TCP , & m_Conn ) ;
Start ( ) ;
}
else if ( m_TCP - > error )
else if ( m_TCP - > error )
{
llarp : : LogError ( " failed to connect tcp " , uv_strerror ( status ) ) ;
m_TCP - > error ( m_TCP ) ;
@ -185,7 +183,7 @@ namespace libuv
void
WriteFail ( )
{
if ( m_Conn . close )
if ( m_Conn . close )
m_Conn . close ( & m_Conn ) ;
}
@ -198,8 +196,8 @@ namespace libuv
static void
OnWritten ( uv_write_t * req , int status )
{
WriteEvent * ev = static_cast < WriteEvent * > ( req - > data ) ;
if ( status = = 0 )
WriteEvent * ev = static_cast < WriteEvent * > ( req - > data ) ;
if ( status = = 0 )
{
llarp : : LogDebug ( " wrote " , ev - > data . size ( ) ) ;
}
@ -213,11 +211,11 @@ namespace libuv
int
WriteAsync ( char * data , size_t sz )
{
if ( uv_is_closing ( ( const uv_handle_t * ) & m_Handle ) )
if ( uv_is_closing ( ( const uv_handle_t * ) & m_Handle ) )
return - 1 ;
WriteEvent * ev = new WriteEvent ( sz , data ) ;
auto buf = ev - > Buffer ( ) ;
if ( uv_write ( ev - > Request ( ) , Stream ( ) , & buf , 1 , & OnWritten ) = = 0 )
if ( uv_write ( ev - > Request ( ) , Stream ( ) , & buf , 1 , & OnWritten ) = = 0 )
return sz ;
delete ev ;
return - 1 ;
@ -226,14 +224,14 @@ namespace libuv
static void
OnClosed ( uv_handle_t * h )
{
conn_glue * conn = static_cast < conn_glue * > ( h - > data ) ;
conn_glue * conn = static_cast < conn_glue * > ( h - > data ) ;
conn - > HandleClosed ( ) ;
}
static void
FullClose ( uv_handle_t * h )
{
auto * self = static_cast < conn_glue * > ( h - > data ) ;
auto * self = static_cast < conn_glue * > ( h - > data ) ;
h - > data = nullptr ;
delete self ;
llarp : : LogDebug ( " deleted " ) ;
@ -243,13 +241,13 @@ namespace libuv
HandleClosed ( )
{
m_Handle . data = nullptr ;
if ( m_Accept )
if ( m_Accept )
{
if ( m_Accept - > closed )
if ( m_Accept - > closed )
m_Accept - > closed ( m_Accept ) ;
m_Accept - > impl = nullptr ;
}
if ( m_Conn . closed )
if ( m_Conn . closed )
{
m_Conn . closed ( & m_Conn ) ;
}
@ -262,7 +260,7 @@ namespace libuv
OnShutdown ( uv_shutdown_t * shut , int code )
{
llarp : : LogDebug ( " shut down " , code ) ;
auto * self = static_cast < conn_glue * > ( shut - > data ) ;
auto * self = static_cast < conn_glue * > ( shut - > data ) ;
uv_close ( ( uv_handle_t * ) & self - > m_Handle , & OnClosed ) ;
delete shut ;
}
@ -270,7 +268,7 @@ namespace libuv
void
Close ( ) override
{
if ( uv_is_closing ( ( uv_handle_t * ) Stream ( ) ) )
if ( uv_is_closing ( ( uv_handle_t * ) Stream ( ) ) )
return ;
llarp : : LogDebug ( " close tcp connection " ) ;
uv_check_stop ( & m_Ticker ) ;
@ -283,9 +281,9 @@ namespace libuv
static void
OnAccept ( uv_stream_t * stream , int status )
{
if ( status = = 0 )
if ( status = = 0 )
{
conn_glue * conn = static_cast < conn_glue * > ( stream - > data ) ;
conn_glue * conn = static_cast < conn_glue * > ( stream - > data ) ;
conn - > Accept ( ) ;
}
else
@ -297,18 +295,18 @@ namespace libuv
static void
OnTick ( uv_check_t * t )
{
conn_glue * conn = static_cast < conn_glue * > ( t - > data ) ;
conn_glue * conn = static_cast < conn_glue * > ( t - > data ) ;
conn - > Tick ( ) ;
}
void
Tick ( )
{
if ( m_Accept & & m_Accept - > tick )
if ( m_Accept & & m_Accept - > tick )
{
m_Accept - > tick ( m_Accept ) ;
}
if ( m_Conn . tick )
if ( m_Conn . tick )
{
m_Conn . tick ( & m_Conn ) ;
}
@ -318,17 +316,17 @@ namespace libuv
Start ( )
{
auto result = uv_check_start ( & m_Ticker , & OnTick ) ;
if ( result )
if ( result )
llarp : : LogError ( " failed to start timer " , uv_strerror ( result ) ) ;
result = uv_read_start ( Stream ( ) , & Alloc , & OnRead ) ;
if ( result )
if ( result )
llarp : : LogError ( " failed to start reader " , uv_strerror ( result ) ) ;
}
void
Accept ( )
{
if ( m_Accept & & m_Accept - > accepted )
if ( m_Accept & & m_Accept - > accepted )
{
auto * child = new conn_glue ( this ) ;
llarp : : LogDebug ( " accepted new connection " ) ;
@ -337,7 +335,7 @@ namespace libuv
child - > m_Conn . close = & ExplicitClose ;
child - > m_Conn . write = & ExplicitWrite ;
auto res = uv_accept ( Stream ( ) , child - > Stream ( ) ) ;
if ( res )
if ( res )
{
llarp : : LogError ( " failed to accept tcp connection " , uv_strerror ( res ) ) ;
child - > Close ( ) ;
@ -353,16 +351,15 @@ namespace libuv
{
uv_check_start ( & m_Ticker , & OnTick ) ;
m_Accept - > close = & ExplicitCloseAccept ;
return uv_tcp_bind ( & m_Handle , m_Addr , 0 ) = = 0
& & uv_listen ( Stream ( ) , 5 , & OnAccept ) = = 0 ;
return uv_tcp_bind ( & m_Handle , m_Addr , 0 ) = = 0 & & uv_listen ( Stream ( ) , 5 , & OnAccept ) = = 0 ;
}
} ;
struct ticker_glue : public glue
{
std : : function < void ( void ) > func ;
std : : function < void ( void ) > func ;
ticker_glue ( uv_loop_t * loop , std : : function < void ( void ) > tick ) : func ( tick )
ticker_glue ( uv_loop_t * loop , std : : function < void ( void ) > tick ) : func ( tick )
{
m_Ticker . data = this ;
uv_check_init ( loop , & m_Ticker ) ;
@ -371,7 +368,7 @@ namespace libuv
static void
OnTick ( uv_check_t * t )
{
ticker_glue * ticker = static_cast < ticker_glue * > ( t - > data ) ;
ticker_glue * ticker = static_cast < ticker_glue * > ( t - > data ) ;
LoopCall ( t , ticker - > func ) ;
}
@ -402,10 +399,9 @@ namespace libuv
llarp_udp_io * const m_UDP ;
llarp : : Addr m_Addr ;
llarp_pkt_list m_LastPackets ;
std : : array < char , 1500 > m_Buffer ;
std : : array < char , 1500 > m_Buffer ;
udp_glue ( uv_loop_t * loop , llarp_udp_io * udp , const sockaddr * src )
: m_UDP ( udp ) , m_Addr ( * src )
udp_glue ( uv_loop_t * loop , llarp_udp_io * udp , const sockaddr * src ) : m_UDP ( udp ) , m_Addr ( * src )
{
m_Handle . data = this ;
m_Ticker . data = this ;
@ -422,14 +418,13 @@ namespace libuv
}
static void
OnRecv ( uv_udp_t * handle , ssize_t nread , const uv_buf_t * buf ,
const struct sockaddr * addr , unsigned )
OnRecv (
uv_udp_t * handle , ssize_t nread , const uv_buf_t * buf , const struct sockaddr * addr , unsigned )
{
udp_glue * glue = static_cast < udp_glue * > ( handle - > data ) ;
if ( addr )
udp_glue * glue = static_cast < udp_glue * > ( handle - > data ) ;
if ( addr )
glue - > RecvFrom ( nread , buf , addr ) ;
if ( nread < = 0 | | glue - > m_UDP = = nullptr
| | glue - > m_UDP - > recvfrom ! = nullptr )
if ( nread < = 0 | | glue - > m_UDP = = nullptr | | glue - > m_UDP - > recvfrom ! = nullptr )
delete [ ] buf - > base ;
}
@ -444,10 +439,10 @@ namespace libuv
void
RecvFrom ( ssize_t sz , const uv_buf_t * buf , const struct sockaddr * fromaddr )
{
if ( sz > 0 & & m_UDP )
if ( sz > 0 & & m_UDP )
{
const size_t pktsz = sz ;
if ( m_UDP - > recvfrom )
if ( m_UDP - > recvfrom )
{
const llarp_buffer_t pkt ( ( const byte_t * ) buf - > base , pktsz ) ;
m_UDP - > recvfrom ( m_UDP , fromaddr , ManagedBuffer { pkt } ) ;
@ -463,22 +458,22 @@ namespace libuv
static void
OnTick ( uv_check_t * t )
{
udp_glue * udp = static_cast < udp_glue * > ( t - > data ) ;
udp_glue * udp = static_cast < udp_glue * > ( t - > data ) ;
udp - > Tick ( ) ;
}
void
Tick ( )
{
if ( m_UDP & & m_UDP - > tick )
if ( m_UDP & & m_UDP - > tick )
m_UDP - > tick ( m_UDP ) ;
}
static int
SendTo ( llarp_udp_io * udp , const sockaddr * to , const byte_t * ptr , size_t sz )
{
auto * self = static_cast < udp_glue * > ( udp - > impl ) ;
if ( self = = nullptr )
auto * self = static_cast < udp_glue * > ( udp - > impl ) ;
if ( self = = nullptr )
return - 1 ;
uv_buf_t buf = uv_buf_init ( ( char * ) ptr , sz ) ;
return uv_udp_try_send ( & self - > m_Handle , & buf , 1 , to ) ;
@ -488,24 +483,24 @@ namespace libuv
Bind ( )
{
auto ret = uv_udp_bind ( & m_Handle , m_Addr , 0 ) ;
if ( ret )
if ( ret )
{
llarp : : LogError ( " failed to bind to " , m_Addr , " " , uv_strerror ( ret ) ) ;
return false ;
}
if ( uv_udp_recv_start ( & m_Handle , & Alloc , & OnRecv ) )
if ( uv_udp_recv_start ( & m_Handle , & Alloc , & OnRecv ) )
{
llarp : : LogError ( " failed to start recving packets via " , m_Addr ) ;
return false ;
}
if ( uv_check_start ( & m_Ticker , & OnTick ) )
if ( uv_check_start ( & m_Ticker , & OnTick ) )
{
llarp : : LogError ( " failed to start ticker " ) ;
return false ;
}
# if defined(_WIN32) || defined(_WIN64)
# else
if ( uv_fileno ( ( const uv_handle_t * ) & m_Handle , & m_UDP - > fd ) )
if ( uv_fileno ( ( const uv_handle_t * ) & m_Handle , & m_UDP - > fd ) )
return false ;
# endif
m_UDP - > sendto = & SendTo ;
@ -516,8 +511,8 @@ namespace libuv
static void
OnClosed ( uv_handle_t * h )
{
auto * glue = static_cast < udp_glue * > ( h - > data ) ;
if ( glue )
auto * glue = static_cast < udp_glue * > ( h - > data ) ;
if ( glue )
{
h - > data = nullptr ;
delete glue ;
@ -554,23 +549,23 @@ namespace libuv
static void
OnRead ( uv_poll_t * handle , int status , int )
{
if ( status )
if ( status )
{
return ;
}
pipe_glue * glue = static_cast < pipe_glue * > ( handle - > data ) ;
pipe_glue * glue = static_cast < pipe_glue * > ( handle - > data ) ;
int r = glue - > m_Pipe - > read ( glue - > m_Buffer , sizeof ( glue - > m_Buffer ) ) ;
if ( r < = 0 )
if ( r < = 0 )
return ;
const llarp_buffer_t buf { glue - > m_Buffer , static_cast < size_t > ( r ) } ;
const llarp_buffer_t buf { glue - > m_Buffer , static_cast < size_t > ( r ) } ;
glue - > m_Pipe - > OnRead ( buf ) ;
}
static void
OnClosed ( uv_handle_t * h )
{
auto * self = static_cast < pipe_glue * > ( h - > data ) ;
if ( self )
auto * self = static_cast < pipe_glue * > ( h - > data ) ;
if ( self )
{
h - > data = nullptr ;
delete self ;
@ -587,16 +582,16 @@ namespace libuv
static void
OnTick ( uv_check_t * h )
{
pipe_glue * pipe = static_cast < pipe_glue * > ( h - > data ) ;
pipe_glue * pipe = static_cast < pipe_glue * > ( h - > data ) ;
LoopCall ( h , std : : bind ( & pipe_glue : : Tick , pipe ) ) ;
}
bool
Start ( )
{
if ( uv_poll_start ( & m_Handle , UV_READABLE , & OnRead ) )
if ( uv_poll_start ( & m_Handle , UV_READABLE , & OnRead ) )
return false ;
if ( uv_check_start ( & m_Ticker , & OnTick ) )
if ( uv_check_start ( & m_Ticker , & OnTick ) )
return false ;
return true ;
}
@ -630,16 +625,16 @@ namespace libuv
static void
OnTick ( uv_check_t * timer )
{
tun_glue * tun = static_cast < tun_glue * > ( timer - > data ) ;
tun_glue * tun = static_cast < tun_glue * > ( timer - > data ) ;
tun - > Tick ( ) ;
}
static void
OnPoll ( uv_poll_t * h , int , int events )
{
if ( events & UV_READABLE )
if ( events & UV_READABLE )
{
static_cast < tun_glue * > ( h - > data ) - > Read ( ) ;
static_cast < tun_glue * > ( h - > data ) - > Read ( ) ;
}
}
@ -647,11 +642,11 @@ namespace libuv
Read ( )
{
auto sz = tuntap_read ( m_Device , m_Buffer , sizeof ( m_Buffer ) ) ;
if ( sz > 0 )
if ( sz > 0 )
{
llarp : : LogDebug ( " tun read " , sz ) ;
const llarp_buffer_t pkt ( m_Buffer , sz ) ;
if ( m_Tun & & m_Tun - > recvpkt )
if ( m_Tun & & m_Tun - > recvpkt )
m_Tun - > recvpkt ( m_Tun , pkt ) ;
}
}
@ -659,17 +654,17 @@ namespace libuv
void
Tick ( )
{
if ( m_Tun - > before_write )
if ( m_Tun - > before_write )
m_Tun - > before_write ( m_Tun ) ;
if ( m_Tun - > tick )
if ( m_Tun - > tick )
m_Tun - > tick ( m_Tun ) ;
}
static void
OnClosed ( uv_handle_t * h )
{
auto * self = static_cast < tun_glue * > ( h - > data ) ;
if ( self )
auto * self = static_cast < tun_glue * > ( h - > data ) ;
if ( self )
{
h - > data = nullptr ;
delete self ;
@ -679,12 +674,12 @@ namespace libuv
void
Close ( ) override
{
if ( m_Tun - > impl = = nullptr )
if ( m_Tun - > impl = = nullptr )
return ;
m_Tun - > impl = nullptr ;
uv_check_stop ( & m_Ticker ) ;
uv_close ( ( uv_handle_t * ) & m_Ticker , [ ] ( uv_handle_t * h ) {
tun_glue * glue = static_cast < tun_glue * > ( h - > data ) ;
tun_glue * glue = static_cast < tun_glue * > ( h - > data ) ;
uv_close ( ( uv_handle_t * ) & glue - > m_Handle , & OnClosed ) ;
} ) ;
}
@ -698,7 +693,7 @@ namespace libuv
static bool
WritePkt ( llarp_tun_io * tun , const byte_t * pkt , size_t sz )
{
tun_glue * glue = static_cast < tun_glue * > ( tun - > impl ) ;
tun_glue * glue = static_cast < tun_glue * > ( tun - > impl ) ;
return glue & & glue - > Write ( pkt , sz ) ;
}
@ -706,46 +701,42 @@ namespace libuv
Init ( uv_loop_t * loop )
{
memcpy ( m_Device - > if_name , m_Tun - > ifname , sizeof ( m_Device - > if_name ) ) ;
if ( tuntap_start ( m_Device , TUNTAP_MODE_TUNNEL , 0 ) = = - 1 )
if ( tuntap_start ( m_Device , TUNTAP_MODE_TUNNEL , 0 ) = = - 1 )
{
llarp : : LogError ( " failed to start up " , m_Tun - > ifname ) ;
return false ;
}
if ( tuntap_set_ip ( m_Device , m_Tun - > ifaddr , m_Tun - > ifaddr , m_Tun - > netmask )
= = - 1 )
if ( tuntap_set_ip ( m_Device , m_Tun - > ifaddr , m_Tun - > ifaddr , m_Tun - > netmask ) = = - 1 )
{
llarp : : LogError ( " failed to set address on " , m_Tun - > ifname ) ;
return false ;
}
if ( tuntap_up ( m_Device ) = = - 1 )
if ( tuntap_up ( m_Device ) = = - 1 )
{
llarp : : LogError ( " failed to put up " , m_Tun - > ifname ) ;
return false ;
}
if ( m_Device - > tun_fd = = - 1 )
if ( m_Device - > tun_fd = = - 1 )
{
llarp : : LogError ( " tun interface " , m_Tun - > ifname ,
" has invalid fd: " , m_Device - > tun_fd ) ;
llarp : : LogError ( " tun interface " , m_Tun - > ifname , " has invalid fd: " , m_Device - > tun_fd ) ;
return false ;
}
tuntap_set_nonblocking ( m_Device , 1 ) ;
if ( uv_poll_init ( loop , & m_Handle , m_Device - > tun_fd ) = = - 1 )
if ( uv_poll_init ( loop , & m_Handle , m_Device - > tun_fd ) = = - 1 )
{
llarp : : LogError ( " failed to start polling on " , m_Tun - > ifname ) ;
return false ;
}
if ( uv_poll_start ( & m_Handle , UV_READABLE , & OnPoll ) )
if ( uv_poll_start ( & m_Handle , UV_READABLE , & OnPoll ) )
{
llarp : : LogError ( " failed to start polling on " , m_Tun - > ifname ) ;
return false ;
}
if ( uv_check_init ( loop , & m_Ticker ) ! = 0
| | uv_check_start ( & m_Ticker , & OnTick ) ! = 0 )
if ( uv_check_init ( loop , & m_Ticker ) ! = 0 | | uv_check_start ( & m_Ticker , & OnTick ) ! = 0 )
{
llarp : : LogError ( " failed to set up tun interface timer for " ,
m_Tun - > ifname ) ;
llarp : : LogError ( " failed to set up tun interface timer for " , m_Tun - > ifname ) ;
return false ;
}
m_Tun - > writepkt = & WritePkt ;
@ -758,23 +749,19 @@ namespace libuv
static void
OnAsyncWake ( uv_async_t * async_handle )
{
Loop * loop = static_cast < Loop * > ( async_handle - > data ) ;
Loop * loop = static_cast < Loop * > ( async_handle - > data ) ;
loop - > process_timer_queue ( ) ;
loop - > process_cancel_queue ( ) ;
}
Loop : : Loop ( )
: llarp_ev_loop ( )
, m_LogicCalls ( 1024 )
, m_timerQueue ( 20 )
, m_timerCancelQueue ( 20 )
Loop : : Loop ( ) : llarp_ev_loop ( ) , m_LogicCalls ( 1024 ) , m_timerQueue ( 20 ) , m_timerCancelQueue ( 20 )
{
}
bool
Loop : : init ( )
{
if ( uv_loop_init ( & m_Impl ) = = - 1 )
if ( uv_loop_init ( & m_Impl ) = = - 1 )
return false ;
# ifdef LOKINET_DEBUG
@ -789,10 +776,12 @@ namespace libuv
# endif
m_LogicCaller . data = this ;
int err ;
if ( ( err = uv_async_init ( & m_Impl , & m_LogicCaller ,
if ( ( err = uv_async_init (
& m_Impl ,
& m_LogicCaller ,
[ ] ( uv_async_t * h ) {
Loop * l = static_cast < Loop * > ( h - > data ) ;
while ( not l - > m_LogicCalls . empty ( ) )
Loop * l = static_cast < Loop * > ( h - > data ) ;
while ( not l - > m_LogicCalls . empty ( ) )
{
auto f = l - > m_LogicCalls . popFront ( ) ;
f ( ) ;
@ -832,7 +821,7 @@ namespace libuv
{
auto * impl = new conn_glue ( & m_Impl , tcp , addr ) ;
tcp - > impl = impl ;
if ( impl - > ConnectAsync ( ) )
if ( impl - > ConnectAsync ( ) )
return true ;
delete impl ;
tcp - > impl = nullptr ;
@ -848,7 +837,7 @@ namespace libuv
int
Loop : : tick ( int ms )
{
if ( m_Run )
if ( m_Run )
{
# ifdef TESTNET_SPEED
ms * = TESTNET_SPEED ;
@ -870,14 +859,13 @@ namespace libuv
{
// have to delete timer handle this way because libuv.
uv_timer_stop ( timer ) ;
uv_close ( ( uv_handle_t * ) timer ,
[ ] ( uv_handle_t * handle ) { delete ( uv_timer_t * ) handle ; } ) ;
uv_close ( ( uv_handle_t * ) timer , [ ] ( uv_handle_t * handle ) { delete ( uv_timer_t * ) handle ; } ) ;
}
static void
OnUVTimer ( uv_timer_t * timer )
{
TimerData * timer_data = static_cast < TimerData * > ( timer - > data ) ;
TimerData * timer_data = static_cast < TimerData * > ( timer - > data ) ;
Loop * loop = timer_data - > loop ;
loop - > do_timer_job ( timer_data - > job_id ) ;
@ -886,8 +874,7 @@ namespace libuv
}
uint32_t
Loop : : call_after_delay ( llarp_time_t delay_ms ,
std : : function < void ( void ) > callback )
Loop : : call_after_delay ( llarp_time_t delay_ms , std : : function < void ( void ) > callback )
{
# ifdef TESTNET_SPEED
delay_ms * = TESTNET_SPEED ;
@ -914,7 +901,7 @@ namespace libuv
void
Loop : : process_timer_queue ( )
{
while ( not m_timerQueue . empty ( ) )
while ( not m_timerQueue . empty ( ) )
{
PendingTimer job = m_timerQueue . popFront ( ) ;
uint64_t job_id = job . job_id ;
@ -935,11 +922,11 @@ namespace libuv
void
Loop : : process_cancel_queue ( )
{
while ( not m_timerCancelQueue . empty ( ) )
while ( not m_timerCancelQueue . empty ( ) )
{
uint64_t job_id = m_timerCancelQueue . popFront ( ) ;
auto itr = m_pendingCalls . find ( job_id ) ;
if ( itr ! = m_pendingCalls . end ( ) )
if ( itr ! = m_pendingCalls . end ( ) )
{
m_pendingCalls . erase ( itr ) ;
}
@ -950,7 +937,7 @@ namespace libuv
Loop : : do_timer_job ( uint64_t job_id )
{
auto itr = m_pendingCalls . find ( job_id ) ;
if ( itr ! = m_pendingCalls . end ( ) )
if ( itr ! = m_pendingCalls . end ( ) )
{
LogicCall ( m_Logic , itr - > second ) ;
m_pendingCalls . erase ( itr ) ;
@ -960,7 +947,7 @@ namespace libuv
void
Loop : : stop ( )
{
if ( m_Run )
if ( m_Run )
{
llarp : : LogInfo ( " stopping event loop " ) ;
CloseAll ( ) ;
@ -976,11 +963,11 @@ namespace libuv
uv_walk (
& m_Impl ,
[ ] ( uv_handle_t * h , void * ) {
if ( uv_is_closing ( h ) )
if ( uv_is_closing ( h ) )
return ;
if ( h - > data & & uv_is_active ( h ) & & h - > type ! = UV_TIMER )
if ( h - > data & & uv_is_active ( h ) & & h - > type ! = UV_TIMER )
{
static_cast < glue * > ( h - > data ) - > Close ( ) ;
static_cast < glue * > ( h - > data ) - > Close ( ) ;
}
} ,
nullptr ) ;
@ -998,7 +985,7 @@ namespace libuv
{
auto * impl = new udp_glue ( & m_Impl , udp , src ) ;
udp - > impl = impl ;
if ( impl - > Bind ( ) )
if ( impl - > Bind ( ) )
{
return true ;
}
@ -1007,10 +994,10 @@ namespace libuv
}
bool
Loop : : add_ticker ( std : : function < void ( void ) > func )
Loop : : add_ticker ( std : : function < void ( void ) > func )
{
auto * ticker = new ticker_glue ( & m_Impl , func ) ;
if ( ticker - > Start ( ) )
if ( ticker - > Start ( ) )
{
return true ;
}
@ -1021,10 +1008,10 @@ namespace libuv
bool
Loop : : udp_close ( llarp_udp_io * udp )
{
if ( udp = = nullptr )
if ( udp = = nullptr )
return false ;
auto * glue = static_cast < udp_glue * > ( udp - > impl ) ;
if ( glue = = nullptr )
auto * glue = static_cast < udp_glue * > ( udp - > impl ) ;
if ( glue = = nullptr )
return false ;
glue - > Close ( ) ;
return true ;
@ -1039,7 +1026,7 @@ namespace libuv
# else
auto * glue = new tun_glue ( tun ) ;
tun - > impl = glue ;
if ( glue - > Init ( & m_Impl ) )
if ( glue - > Init ( & m_Impl ) )
{
return true ;
}
@ -1053,7 +1040,7 @@ namespace libuv
{
auto * glue = new conn_glue ( & m_Impl , tcp , addr ) ;
tcp - > impl = glue ;
if ( glue - > Server ( ) )
if ( glue - > Server ( ) )
return true ;
tcp - > impl = nullptr ;
delete glue ;
@ -1064,14 +1051,14 @@ namespace libuv
Loop : : add_pipe ( llarp_ev_pkt_pipe * p )
{
auto * glue = new pipe_glue ( & m_Impl , p ) ;
if ( glue - > Start ( ) )
if ( glue - > Start ( ) )
return true ;
delete glue ;
return false ;
}
void
Loop : : call_soon ( std : : function < void ( void ) > f )
Loop : : call_soon ( std : : function < void ( void ) > f )
{
m_LogicCalls . tryPushBack ( f ) ;
uv_async_send ( & m_LogicCaller ) ;
@ -1082,5 +1069,5 @@ namespace libuv
bool
llarp_ev_udp_recvmany ( struct llarp_udp_io * u , struct llarp_pkt_list * pkts )
{
return static_cast < libuv : : udp_glue * > ( u - > impl ) - > RecvMany ( pkts ) ;
return static_cast < libuv : : udp_glue * > ( u - > impl ) - > RecvMany ( pkts ) ;
}