use timers not idle

pull/1334/head
Jeff Becker 5 years ago
parent 9deafa4cb8
commit b6a1fc4c86
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -176,17 +176,19 @@ namespace libuv
struct udp_glue
{
uv_udp_t m_Handle;
uv_idle_t m_Ticker;
uv_timer_t m_Ticker;
llarp_udp_io* const m_UDP;
llarp::Addr m_Addr;
bool gotpkts;
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;
gotpkts = false;
uv_udp_init(loop, &m_Handle);
uv_idle_init(loop, &m_Ticker);
uv_timer_init(loop, &m_Ticker);
}
static void
@ -213,11 +215,12 @@ namespace libuv
const size_t pktsz = sz;
const llarp_buffer_t pkt{(const byte_t*)buf->base, pktsz};
m_UDP->recvfrom(m_UDP, fromaddr, ManagedBuffer{pkt});
gotpkts = true;
}
}
static void
OnTick(uv_idle_t* t)
OnTick(uv_timer_t* t)
{
static_cast< udp_glue* >(t->data)->Tick();
}
@ -225,9 +228,14 @@ namespace libuv
void
Tick()
{
llarp::LogDebug("udp tick");
if(m_UDP && m_UDP->tick)
m_UDP->tick(m_UDP);
if(gotpkts)
{
llarp::LogDebug("udp tick");
if(m_UDP && m_UDP->tick)
m_UDP->tick(m_UDP);
}
gotpkts = false;
uv_timer_again(&m_Ticker);
}
static int
@ -252,7 +260,7 @@ namespace libuv
llarp::LogError("failed to start recving packets via ", m_Addr);
return false;
}
if(uv_idle_start(&m_Ticker, &OnTick))
if(uv_timer_start(&m_Ticker, &OnTick, 50, 50))
{
llarp::LogError("failed to start ticker");
return false;
@ -274,7 +282,7 @@ namespace libuv
void
Close()
{
uv_idle_stop(&m_Ticker);
uv_timer_stop(&m_Ticker);
uv_close((uv_handle_t*)&m_Handle, &OnClosed);
}
};
@ -282,13 +290,17 @@ namespace libuv
struct tun_glue
{
uv_poll_t m_Handle;
uv_idle_t m_Ticker;
uv_timer_t m_Ticker;
llarp_tun_io* const m_Tun;
device* const m_Device;
byte_t m_Buffer[1500];
bool readpkt;
tun_glue(llarp_tun_io* tun) : m_Tun(tun), m_Device(tuntap_init())
{
m_Handle.data = this;
m_Ticker.data = this;
readpkt = false;
}
~tun_glue()
@ -302,13 +314,37 @@ namespace libuv
static_cast< tun_glue* >(timer->data)->Tick();
}
static void
OnPoll(uv_poll_t* h, int status, int)
{
if(status == 0)
{
static_cast< tun_glue* >(h->data)->Read();
}
}
void
Read()
{
auto sz = tuntap_read(m_Device, m_Buffer, sizeof(m_Buffer));
llarp_buffer_t pkt(m_Buffer, sz);
if(m_Tun && m_Tun->recvpkt)
m_Tun->recvpkt(m_Tun, pkt);
readpkt = true;
}
void
Tick()
{
if(m_Tun->tick)
m_Tun->tick(m_Tun);
if(m_Tun->before_write)
m_Tun->before_write(m_Tun);
if(readpkt)
{
if(m_Tun->tick)
m_Tun->tick(m_Tun);
if(m_Tun->before_write)
m_Tun->before_write(m_Tun);
}
readpkt = false;
uv_timer_again(&m_Ticker);
}
static void
@ -349,7 +385,13 @@ namespace libuv
llarp::LogError("failed to start polling on ", m_Tun->ifname);
return false;
}
if(uv_idle_init(loop, &m_Ticker) == -1)
if(uv_poll_start(&m_Handle, UV_READABLE, &OnPoll))
{
llarp::LogError("failed to start polling on ", m_Tun->ifname);
return false;
}
if(uv_timer_init(loop, &m_Ticker) != 0
|| uv_timer_start(&m_Ticker, &OnTick, 50, 50) != 0)
{
llarp::LogError("failed to set up tun interface timer for ",
m_Tun->ifname);
@ -408,7 +450,7 @@ namespace libuv
Loop::tick(int ms)
{
uv_timer_start(&m_TickTimer, &OnTickTimeout, ms, 0);
uv_run(m_Impl.get(), UV_RUN_NOWAIT);
uv_run(m_Impl.get(), UV_RUN_ONCE);
return 0;
}

Loading…
Cancel
Save