Merge pull request #398 from majestrate/staging

reset errno
pull/409/head
Jeff 6 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 #error no event loop subclass
#endif #endif
r->init(); r->init();
r->_now = llarp::time_now_ms(); r->update_time();
return r; return r;
} }
@ -71,7 +70,7 @@ llarp_ev_loop_run(struct llarp_ev_loop *ev, llarp::Logic *logic)
{ {
while(ev->running()) while(ev->running())
{ {
ev->_now = llarp::time_now_ms(); ev->update_time();
ev->tick(EV_TICK_INTERVAL); ev->tick(EV_TICK_INTERVAL);
if(ev->running()) if(ev->running())
logic->tick(ev->_now); logic->tick(ev->_now);
@ -92,12 +91,12 @@ llarp_ev_loop_run_single_process(struct llarp_ev_loop *ev,
{ {
while(ev->running()) while(ev->running())
{ {
ev->_now = llarp::time_now_ms(); ev->update_time();
ev->tick(EV_TICK_INTERVAL); ev->tick(EV_TICK_INTERVAL);
if(ev->running()) if(ev->running())
{ {
ev->_now = llarp::time_now_ms(); ev->update_time();
logic->tick_async(ev->_now); logic->tick_async(ev->time_now());
llarp_threadpool_tick(tp); llarp_threadpool_tick(tp);
} }
} }
@ -125,7 +124,7 @@ llarp_time_t
llarp_ev_loop_time_now_ms(struct llarp_ev_loop *loop) llarp_ev_loop_time_now_ms(struct llarp_ev_loop *loop)
{ {
if(loop) if(loop)
return loop->_now; return loop->time_now();
return llarp::time_now_ms(); return llarp::time_now_ms();
} }

@ -50,6 +50,15 @@ typedef struct sockaddr_un
#define EV_WRITE_BUF_SZ (2 * 1024UL) #define EV_WRITE_BUF_SZ (2 * 1024UL)
#endif #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 namespace llarp
{ {
#ifdef _WIN32 #ifdef _WIN32
@ -697,6 +706,18 @@ struct llarp_ev_loop
virtual bool virtual bool
running() const = 0; 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) /// return false on socket error (non blocking)
virtual bool virtual bool
tcp_connect(llarp_tcp_connecter* tcp, const sockaddr* addr) = 0; 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)); " events=", std::to_string(events[idx].events));
if(events[idx].events & EPOLLERR && errno) if(events[idx].events & EPOLLERR && errno)
{ {
llarp::LogDebug("epoll error"); IO([&]() -> ssize_t {
ev->error(); llarp::LogDebug("epoll error");
errno = 0; ev->error();
return 0;
});
} }
else else
{ {
// write THEN READ don't revert me // write THEN READ don't revert me
if(events[idx].events & EPOLLOUT) if(events[idx].events & EPOLLOUT)
{ {
llarp::LogDebug("epoll out"); IO([&]() -> ssize_t {
ev->flush_write(); llarp::LogDebug("epoll out");
ev->flush_write();
return 0;
});
} }
if(events[idx].events & EPOLLIN) if(events[idx].events & EPOLLIN)
{ {
llarp::LogDebug("epoll in"); ssize_t amount = IO([&]() -> ssize_t {
if(ev->read(readbuf, sizeof(readbuf)) > 0) llarp::LogDebug("epoll in");
return ev->read(readbuf, sizeof(readbuf));
});
if(amount > 0)
didIO = true; didIO = true;
} }
} }
@ -367,9 +375,8 @@ llarp_epoll_loop::tick(int ms)
if(result != -1) if(result != -1)
tick_listeners(); tick_listeners();
/// if we didn't get an io events we sleep to avoid 100% cpu use /// if we didn't get an io events we sleep to avoid 100% cpu use
errno = 0;
if(!didIO) if(!didIO)
std::this_thread::sleep_for(std::chrono::milliseconds(ms)); std::this_thread::sleep_for(std::chrono::milliseconds(5));
return result; return result;
} }

Loading…
Cancel
Save