Merge pull request #398 from majestrate/staging

reset errno
pull/409/head
Jeff 5 years ago committed by GitHub
commit 6e34024336
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23

@ -51,8 +51,7 @@ llarp_make_ev_loop()
#error no event loop subclass
#endif
r->init();
r->_now = llarp::time_now_ms();
r->update_time();
return r;
}
@ -71,7 +70,7 @@ llarp_ev_loop_run(struct llarp_ev_loop *ev, llarp::Logic *logic)
{
while(ev->running())
{
ev->_now = llarp::time_now_ms();
ev->update_time();
ev->tick(EV_TICK_INTERVAL);
if(ev->running())
logic->tick(ev->_now);
@ -92,12 +91,12 @@ llarp_ev_loop_run_single_process(struct llarp_ev_loop *ev,
{
while(ev->running())
{
ev->_now = llarp::time_now_ms();
ev->update_time();
ev->tick(EV_TICK_INTERVAL);
if(ev->running())
{
ev->_now = llarp::time_now_ms();
logic->tick_async(ev->_now);
ev->update_time();
logic->tick_async(ev->time_now());
llarp_threadpool_tick(tp);
}
}
@ -125,7 +124,7 @@ llarp_time_t
llarp_ev_loop_time_now_ms(struct llarp_ev_loop *loop)
{
if(loop)
return loop->_now;
return loop->time_now();
return llarp::time_now_ms();
}

@ -50,6 +50,15 @@ typedef struct sockaddr_un
#define EV_WRITE_BUF_SZ (2 * 1024UL)
#endif
/// do io and reset errno after
static ssize_t
IO(std::function< ssize_t(void) > iofunc)
{
ssize_t ret = iofunc();
errno = 0;
return ret;
}
namespace llarp
{
#ifdef _WIN32
@ -697,6 +706,18 @@ struct llarp_ev_loop
virtual bool
running() const = 0;
void
update_time()
{
_now = llarp::time_now_ms();
}
virtual llarp_time_t
time_now() const
{
return _now;
}
/// return false on socket error (non blocking)
virtual bool
tcp_connect(llarp_tcp_connecter* tcp, const sockaddr* addr) = 0;

@ -341,22 +341,30 @@ llarp_epoll_loop::tick(int ms)
" events=", std::to_string(events[idx].events));
if(events[idx].events & EPOLLERR && errno)
{
llarp::LogDebug("epoll error");
ev->error();
errno = 0;
IO([&]() -> ssize_t {
llarp::LogDebug("epoll error");
ev->error();
return 0;
});
}
else
{
// write THEN READ don't revert me
if(events[idx].events & EPOLLOUT)
{
llarp::LogDebug("epoll out");
ev->flush_write();
IO([&]() -> ssize_t {
llarp::LogDebug("epoll out");
ev->flush_write();
return 0;
});
}
if(events[idx].events & EPOLLIN)
{
llarp::LogDebug("epoll in");
if(ev->read(readbuf, sizeof(readbuf)) > 0)
ssize_t amount = IO([&]() -> ssize_t {
llarp::LogDebug("epoll in");
return ev->read(readbuf, sizeof(readbuf));
});
if(amount > 0)
didIO = true;
}
}
@ -367,9 +375,8 @@ llarp_epoll_loop::tick(int ms)
if(result != -1)
tick_listeners();
/// if we didn't get an io events we sleep to avoid 100% cpu use
errno = 0;
if(!didIO)
std::this_thread::sleep_for(std::chrono::milliseconds(ms));
std::this_thread::sleep_for(std::chrono::milliseconds(5));
return result;
}

Loading…
Cancel
Save