swapped out the epoll stuff in seperate files

This commit is contained in:
Jan Losinshi 2008-08-22 00:19:54 +02:00
parent ced4343f69
commit b64a998544
5 changed files with 110 additions and 59 deletions

View File

@ -1,4 +1,4 @@
OBJECTS=xerxes.cxx socket.cxx
OBJECTS=xerxes.cxx socket.cxx epoll.cxx
BIN=xerxes
$(BIN): $(OBJECTS)
@ -12,4 +12,4 @@ test: $(BIN)
clean:
rm -f $(BIN) *.o *.cxx~ *.hxx~ Makefile~
.PHONY: all
.PHONY: all

62
epoll.cxx Normal file
View File

@ -0,0 +1,62 @@
/**
* xerxes - mysql proxying
* ``Why do you persist in your loneliness?'' --Xerxes
* (c) 2008
* Jan Losinski <losinshi@wh2.tu-dresden.de>
* Maximilian Marx <mmarx@wh2.tu-dresden.de>
*/
#include "epoll.hxx"
namespace xerxes
{
EPoll::EPoll() : fd(epoll_create(64))
{
if(fd < 0)
{
throw std::runtime_error("could not create epoll descriptor.");
}
}
EPoll::~EPoll()
{
if(fd > 0)
{
close(fd);
}
}
void
EPoll::add(Socket const& source,
Socket const& target)
{
events[source.fd] = event_t(new epoll_event);
events[target.fd] = event_t(new epoll_event);
events[source.fd]->events = EPOLLIN
| EPOLLPRI | EPOLLERR | EPOLLHUP;
events[target.fd]->events = events[source.fd]->events;
events[source.fd]->data.fd = target.fd;
events[target.fd]->data.fd = source.fd;
epoll_ctl(fd, EPOLL_CTL_ADD, source.fd, events[source.fd].get());
epoll_ctl(fd, EPOLL_CTL_ADD, target.fd, events[target.fd].get());
}
void
EPoll::add(Socket const& socket)
{
events[socket.fd] = event_t(new epoll_event);
events[socket.fd]->events = EPOLLIN;
events[socket.fd]->data.fd = -1;
epoll_ctl(fd, EPOLL_CTL_ADD, socket.fd, events[socket.fd].get());
}
void
EPoll::del(Socket const& socket)
{
epoll_ctl(fd, EPOLL_CTL_DEL, socket.fd, 0);
events.erase(socket.fd);
}
}

45
epoll.hxx Normal file
View File

@ -0,0 +1,45 @@
/**
* xerxes - mysql proxying
* ``Why do you persist in your loneliness?'' --Xerxes
* (c) 2008
* Jan Losinski <losinshi@wh2.tu-dresden.de>
* Maximilian Marx <mmarx@wh2.tu-dresden.de>
*/
#ifndef XERXES_EPOLL_HXX
#define XERXES_EPOLL_HXX
#include <stdexcept>
#include <utility>
#include <map>
#include <boost/utility.hpp>
#include <boost/shared_ptr.hpp>
#include <sys/types.h>
#include <sys/epoll.h>
#include "socket.hxx"
namespace xerxes
{
struct EPoll
{
EPoll();
virtual ~EPoll();
typedef boost::shared_ptr<epoll_event> event_t;
void
add(Socket const& source,
Socket const& target);
void
add(Socket const& socket);
void
del(Socket const& socket);
int fd;
std::map<int, event_t> events;
};
}
#endif

View File

@ -70,63 +70,6 @@ namespace xerxes
sockaddr const* const bind_address,
socklen_t addrlen);
struct EPoll
{
EPoll() : fd(epoll_create(64))
{
if(fd < 0)
{
throw std::runtime_error("could not create epoll descriptor.");
}
}
virtual ~EPoll()
{
if(fd > 0)
{
close(fd);
}
}
typedef boost::shared_ptr<epoll_event> event_t;
void
add(Socket const& source,
Socket const& target)
{
events[source.fd] = event_t(new epoll_event);
events[target.fd] = event_t(new epoll_event);
events[source.fd]->events = EPOLLIN
| EPOLLPRI | EPOLLERR | EPOLLHUP;
events[target.fd]->events = events[source.fd]->events;
events[source.fd]->data.fd = target.fd;
events[target.fd]->data.fd = source.fd;
epoll_ctl(fd, EPOLL_CTL_ADD, source.fd, events[source.fd].get());
epoll_ctl(fd, EPOLL_CTL_ADD, target.fd, events[target.fd].get());
}
void
add(Socket const& socket)
{
events[socket.fd] = event_t(new epoll_event);
events[socket.fd]->events = EPOLLIN;
events[socket.fd]->data.fd = -1;
epoll_ctl(fd, EPOLL_CTL_ADD, socket.fd, events[socket.fd].get());
}
void
del(Socket const& socket)
{
epoll_ctl(fd, EPOLL_CTL_DEL, socket.fd, 0);
events.erase(socket.fd);
}
int fd;
std::map<int, event_t> events;
};
class SocketErr{};
class ConResetErr: public SocketErr{};

View File

@ -12,6 +12,7 @@
#include <sys/socket.h>
#include <netdb.h>
#include "socket.hxx"
#include "epoll.hxx"
int
main(int argc, char* argv[])