Conversion to listless socket management.
This commit is contained in:
1 parent
796ddd511f
commit
cb7a556edf
5 files changed
+37
-80
No files matched your search
@@ -69,44 +69,17 @@ namespace core {
|
||||
}
|
||||
|
||||
bool EPoll::registerSocket(Socket *socket) {
|
||||
lock.lock();
|
||||
std::map<int, Socket *>::iterator temp = sockets.find(socket->getDescriptor());
|
||||
if(temp != sockets.end())
|
||||
throw coreutils::Exception("Attempt to register socket that is already registered.");
|
||||
coreutils::Log(coreutils::LOG_DEBUG_3) << "Registering socket " << socket->getDescriptor() << ".";
|
||||
sockets.insert(std::pair<int, Socket *>(socket->getDescriptor(), socket));
|
||||
enableSocket(socket);
|
||||
lock.unlock();
|
||||
return true;
|
||||
}
|
||||
|
||||
bool EPoll::unregisterSocket(Socket *socket) {
|
||||
lock.lock();
|
||||
disableSocket(socket);
|
||||
coreutils::Log(coreutils::LOG_DEBUG_3) << "Unregistering socket " << socket->getDescriptor() << ".";
|
||||
std::map<int, Socket *>::iterator temp = sockets.find(socket->getDescriptor());
|
||||
if(temp == sockets.end())
|
||||
throw coreutils::Exception("Attempt to unregister socket that is not registered.");
|
||||
sockets.erase(temp);
|
||||
lock.unlock();
|
||||
disableSocket(socket);
|
||||
return true;
|
||||
}
|
||||
|
||||
void EPoll::eventReceived(struct epoll_event event, pid_t threadId) {
|
||||
lock.lock();
|
||||
std::map<int, Socket *>::iterator socket = sockets.find(event.data.fd);
|
||||
lock.unlock();
|
||||
Socket *socket1 = (Socket *)event.data.ptr;
|
||||
coreutils::Log(coreutils::LOG_DEBUG_3) << "Sockets: " << socket->second << ":" << socket1 << ".";
|
||||
if(socket != sockets.end()) {
|
||||
socket->second->reset = true;
|
||||
socket->second->eventReceived(event, threadId);
|
||||
// resetSocket(socket->second);
|
||||
}
|
||||
else
|
||||
throw coreutils::Exception("Reference to socket that has no object.");
|
||||
}
|
||||
|
||||
|
||||
int EPoll::getDescriptor() {
|
||||
return epfd;
|
||||
}
|
||||
@@ -122,40 +95,26 @@ namespace core {
|
||||
}
|
||||
|
||||
void EPoll::enableSocket(Socket *socket) {
|
||||
coreutils::Log(coreutils::LOG_DEBUG_4) << "Enabling socket " << socket->getDescriptor() << " for events.";
|
||||
struct epoll_event event;
|
||||
event.data.ptr = socket;
|
||||
event.events = EPOLLIN | EPOLLONESHOT | EPOLLRDHUP | EPOLLET;
|
||||
epoll_ctl(epfd, EPOLL_CTL_ADD, socket->getDescriptor(), &event);
|
||||
}
|
||||
|
||||
void EPoll::disableSocket(Socket *socket) {
|
||||
coreutils::Log(coreutils::LOG_DEBUG_4) << "Disabling socket " << socket->getDescriptor() << " from events.";
|
||||
epoll_ctl(epfd, EPOLL_CTL_DEL, socket->getDescriptor(), NULL);
|
||||
}
|
||||
|
||||
void EPoll::resetSocket(Socket *socket) {
|
||||
coreutils::Log(coreutils::LOG_DEBUG_4) << "Resetting socket " << socket->getDescriptor() << " for read.";
|
||||
struct epoll_event event;
|
||||
event.data.fd = socket->getDescriptor();
|
||||
event.data.ptr = socket;
|
||||
event.events = EPOLLIN | EPOLLONESHOT | EPOLLRDHUP | EPOLLET;
|
||||
if(socket->needsToWrite())
|
||||
event.events |= EPOLLWRNORM;
|
||||
epoll_ctl(epfd, EPOLL_CTL_ADD, event.data.fd, &event);
|
||||
socket->reset = false;
|
||||
coreutils::Log(coreutils::LOG_DEBUG_4) << "Enabling socket " << socket->getDescriptor() << " for events.";
|
||||
}
|
||||
|
||||
void EPoll::disableSocket(Socket *socket) {
|
||||
epoll_ctl(epfd, EPOLL_CTL_DEL, socket->getDescriptor(), NULL);
|
||||
socket->reset = false;
|
||||
coreutils::Log(coreutils::LOG_DEBUG_4) << "Disabling socket " << socket->getDescriptor() << " from events.";
|
||||
}
|
||||
|
||||
void EPoll::resetRead(Socket *socket) {
|
||||
struct epoll_event event;
|
||||
event.data.fd = socket->getDescriptor();
|
||||
event.data.ptr = socket;
|
||||
event.events = EPOLLIN | EPOLLONESHOT | EPOLLRDHUP | EPOLLET;
|
||||
epoll_ctl(epfd, EPOLL_CTL_MOD, event.data.fd, &event);
|
||||
socket->reset = false;
|
||||
coreutils::Log(coreutils::LOG_DEBUG_4) << "Resetting socket " << socket->getDescriptor() << " for read.";
|
||||
}
|
||||
|
||||
void EPoll::resetWrite(Socket *socket) {
|
||||
struct epoll_event event;
|
||||
event.data.fd = socket->getDescriptor();
|
||||
event.data.ptr = socket;
|
||||
event.events = EPOLLWRNORM | EPOLLONESHOT | EPOLLRDHUP | EPOLLET;
|
||||
epoll_ctl(epfd, EPOLL_CTL_ADD, event.data.fd, &event);
|
||||
coreutils::Log(coreutils::LOG_DEBUG_4) << "Resetting socket " << socket->getDescriptor() << " for write.";
|
||||
epoll_ctl(epfd, EPOLL_CTL_MOD, socket->getDescriptor(), &event);
|
||||
}
|
||||
|
||||
}
|
||||
Reference in new issue
Block a user