mirror of https://github.com/agdsn/xerxes.git
swapped out the epoll stuff in seperate files
This commit is contained in:
parent
ced4343f69
commit
b64a998544
4
Makefile
4
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
|
||||
.PHONY: all
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
57
socket.hxx
57
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<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{};
|
||||
|
|
|
|||
|
|
@ -12,6 +12,7 @@
|
|||
#include <sys/socket.h>
|
||||
#include <netdb.h>
|
||||
#include "socket.hxx"
|
||||
#include "epoll.hxx"
|
||||
|
||||
int
|
||||
main(int argc, char* argv[])
|
||||
|
|
|
|||
Loading…
Reference in New Issue