don't make tcp event code epoll specific

pull/35/head
Jeff Becker 6 years ago
parent 957a5ed833
commit de17324012
No known key found for this signature in database
GPG Key ID: F357B3B42F6F9B05

@ -555,7 +555,7 @@ main(int argc, char *argv[])
// Base32Decode(rcfname, addr);
llarp::LogInfo("Addr ", addr);
llarp::routing::DHTMessage *msg = new llarp::routing::DHTMessage();
// uint64_t txid, const llarp::service::Address& addr
// FIXME: new API?
// msg->M.push_back(new llarp::dht::FindIntroMessage(tag, 1));

@ -175,3 +175,38 @@ llarp_tcp_conn_close(struct llarp_tcp_conn *conn)
// delete conn
delete conn;
}
namespace llarp
{
int
tcp_serv::read(void *, size_t)
{
int new_fd = ::accept(fd, nullptr, nullptr);
if(new_fd == -1)
{
llarp::LogError("failed to accept on ", fd, ":", strerror(errno));
return -1;
}
llarp_tcp_conn *conn = new llarp_tcp_conn;
// zero out callbacks
conn->tick = nullptr;
conn->closed = nullptr;
conn->read = nullptr;
// build handler
llarp::tcp_conn *connimpl = new tcp_conn(new_fd, conn);
conn->impl = connimpl;
conn->loop = loop;
if(loop->add_ev(connimpl, true))
{
// call callback
if(tcp->accepted)
tcp->accepted(tcp, conn);
return 0;
}
// cleanup error
delete conn;
delete connimpl;
return -1;
}
} // namespace llarp

@ -212,6 +212,74 @@ namespace llarp
#endif
};
};
struct tcp_conn : public ev_io
{
llarp_tcp_conn* tcp;
tcp_conn(int fd, llarp_tcp_conn* conn)
: ev_io(fd, new LosslessWriteQueue_t()), tcp(conn)
{
}
virtual int
do_write(const void* buf, size_t sz)
{
return ::send(fd, buf, sz, MSG_NOSIGNAL); // ignore sigpipe
}
int
read(void* buf, size_t sz)
{
ssize_t amount = ::read(fd, buf, sz);
if(amount > 0)
{
if(tcp->read)
tcp->read(tcp, buf, amount);
}
else
{
// error
llarp_tcp_conn_close(tcp);
return -1;
}
return 0;
}
void
tick()
{
if(tcp->tick)
tcp->tick(tcp);
}
int
sendto(const sockaddr*, const void*, size_t)
{
return -1;
}
};
struct tcp_serv : public ev_io
{
llarp_ev_loop* loop;
llarp_tcp_acceptor* tcp;
tcp_serv(llarp_ev_loop* l, int fd, llarp_tcp_acceptor* t)
: ev_io(fd), loop(l), tcp(t)
{
}
void
tick()
{
if(tcp->tick)
tcp->tick(tcp);
}
/// actually does accept() :^)
virtual int
read(void*, size_t);
};
}; // namespace llarp
struct llarp_ev_loop

@ -18,104 +18,6 @@
namespace llarp
{
struct tcp_conn : public ev_io
{
llarp_tcp_conn* tcp;
tcp_conn(int fd, llarp_tcp_conn* conn)
: ev_io(fd, new LosslessWriteQueue_t()), tcp(conn)
{
}
virtual int
do_write(const void* buf, size_t sz)
{
return ::send(fd, buf, sz, MSG_NOSIGNAL); // ignore sigpipe
}
int
read(void* buf, size_t sz)
{
ssize_t amount = ::read(fd, buf, sz);
if(amount > 0)
{
if(tcp->read)
tcp->read(tcp, buf, amount);
}
else
{
// error
llarp_tcp_conn_close(tcp);
return -1;
}
return 0;
}
void
tick()
{
if(tcp->tick)
tcp->tick(tcp);
}
int
sendto(const sockaddr*, const void*, size_t)
{
return -1;
}
};
struct tcp_serv : public ev_io
{
llarp_ev_loop* loop;
llarp_tcp_acceptor* tcp;
tcp_serv(llarp_ev_loop* l, int fd, llarp_tcp_acceptor* t)
: ev_io(fd), loop(l), tcp(t)
{
// TODO: handle fail
assert(listen(fd, 5) != -1);
}
void
tick()
{
if(tcp->tick)
tcp->tick(tcp);
}
/// actually does accept() :^)
int
read(void*, size_t)
{
int new_fd = ::accept(fd, nullptr, nullptr);
if(new_fd == -1)
{
llarp::LogError("failed to accept on ", fd, ":", strerror(errno));
return -1;
}
llarp_tcp_conn* conn = new llarp_tcp_conn;
// zero out callbacks
conn->tick = nullptr;
conn->closed = nullptr;
conn->read = nullptr;
// build handler
llarp::tcp_conn* connimpl = new tcp_conn(new_fd, conn);
conn->impl = connimpl;
conn->loop = loop;
if(loop->add_ev(connimpl, true))
{
// call callback
if(tcp->accepted)
tcp->accepted(tcp, conn);
return 0;
}
// cleanup error
delete conn;
delete connimpl;
return -1;
}
};
struct udp_listener : public ev_io
{
llarp_udp_io* udp;
@ -425,7 +327,12 @@ struct llarp_epoll_loop : public llarp_ev_loop
{
sz = sizeof(sockaddr_un);
}
if(bind(fd, bindaddr, sz) == -1)
if(::bind(fd, bindaddr, sz) == -1)
{
::close(fd);
return nullptr;
}
if(::listen(fd, 5) == -1)
{
::close(fd);
return nullptr;

Loading…
Cancel
Save