From b64a998544c40f3e65df416a7b7df5b9cc1077ef Mon Sep 17 00:00:00 2001 From: Jan Losinshi Date: Fri, 22 Aug 2008 00:19:54 +0200 Subject: [PATCH] swapped out the epoll stuff in seperate files --- Makefile | 4 ++-- epoll.cxx | 62 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ epoll.hxx | 45 +++++++++++++++++++++++++++++++++++++++ socket.hxx | 57 ------------------------------------------------- xerxes.cxx | 1 + 5 files changed, 110 insertions(+), 59 deletions(-) create mode 100644 epoll.cxx create mode 100644 epoll.hxx diff --git a/Makefile b/Makefile index f14b267..cc59657 100644 --- a/Makefile +++ b/Makefile @@ -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 \ No newline at end of file +.PHONY: all diff --git a/epoll.cxx b/epoll.cxx new file mode 100644 index 0000000..03c8f99 --- /dev/null +++ b/epoll.cxx @@ -0,0 +1,62 @@ +/** + * xerxes - mysql proxying + * ``Why do you persist in your loneliness?'' --Xerxes + * (c) 2008 + * Jan Losinski + * Maximilian Marx + */ + +#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); + } +} diff --git a/epoll.hxx b/epoll.hxx new file mode 100644 index 0000000..26d1f85 --- /dev/null +++ b/epoll.hxx @@ -0,0 +1,45 @@ +/** + * xerxes - mysql proxying + * ``Why do you persist in your loneliness?'' --Xerxes + * (c) 2008 + * Jan Losinski + * Maximilian Marx + */ + +#ifndef XERXES_EPOLL_HXX +#define XERXES_EPOLL_HXX + +#include +#include +#include +#include +#include +#include +#include +#include "socket.hxx" + +namespace xerxes +{ + struct EPoll + { + EPoll(); + + virtual ~EPoll(); + + typedef boost::shared_ptr event_t; + + void + add(Socket const& source, + Socket const& target); + + void + add(Socket const& socket); + + void + del(Socket const& socket); + + int fd; + std::map events; + }; +} +#endif diff --git a/socket.hxx b/socket.hxx index 8f92ea9..a9f95e1 100644 --- a/socket.hxx +++ b/socket.hxx @@ -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 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 events; - }; class SocketErr{}; class ConResetErr: public SocketErr{}; diff --git a/xerxes.cxx b/xerxes.cxx index d1a5011..68fece6 100644 --- a/xerxes.cxx +++ b/xerxes.cxx @@ -12,6 +12,7 @@ #include #include #include "socket.hxx" +#include "epoll.hxx" int main(int argc, char* argv[])