Major changes to socket scheduling in EPoll.

This commit is contained in:
barant committed 2020-02-29 19:27:58 -08:00
1 parent 790906a6dc
commit a5a51f8aae
512 files changed
+22663 -2121

No files matched your search

+47 -14
View File
@@ -69,20 +69,23 @@ namespace core {
}
bool EPoll::registerSocket(Socket *socket) {
lock.lock();
coreutils::Log(coreutils::LOG_DEBUG_2) << "0001-" << socket->getDescriptor();
std::map<int, Socket *>::iterator temp = sockets.find(socket->getDescriptor());
coreutils::Log(coreutils::LOG_DEBUG_2) << "0002-" << socket->getDescriptor();
if(temp != sockets.end())
throw coreutils::Exception("Attempt to register socket that is already registered.");
coreutils::Log(coreutils::LOG_DEBUG_2) << "0003-" << socket->getDescriptor();
coreutils::Log(coreutils::LOG_DEBUG_3) << "Registering socket " << socket->getDescriptor() << ".";
sockets.insert(std::pair<int, Socket *>(socket->getDescriptor(), socket));
lock.unlock();
socket->enable(true);
coreutils::Log(coreutils::LOG_DEBUG_2) << "0004-" << socket->getDescriptor();
enableSocket(socket);
coreutils::Log(coreutils::LOG_DEBUG_2) << "0005-" << socket->getDescriptor();
return true;
}
bool EPoll::unregisterSocket(Socket *socket /**< The Socket to unregister. */) {
lock.lock();
socket->enable(false);
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())
@@ -93,15 +96,16 @@ namespace core {
}
void EPoll::eventReceived(struct epoll_event event) {
lock.lock();
std::map<int, Socket *>::iterator socket = sockets.find(event.data.fd);
lock.unlock();
if(socket != sockets.end()) {
(socket->second)->eventReceived(event);
} else {
coreutils::Log(coreutils::LOG_WARN) << "System problem. Reference to socket " << event.data.fd << " that has no object.";
throw coreutils::Exception("System problem occurred.");
}
if(socket != sockets.end()) {
if(socket->second->eventReceived(event)) {
coreutils::Log(coreutils::LOG_DEBUG_4) << "resetSocket from eventReceived.";
resetSocket(socket->second);
}
}
else
throw coreutils::Exception("Reference to socket that has no object.");
}
int EPoll::getDescriptor() {
@@ -114,8 +118,37 @@ namespace core {
data << "|" << ++sequence;
threadx.output(data);
data << "|" << std::endl;
}
}
}
void EPoll::enableSocket(Socket *socket) {
struct epoll_event event;
event.data.fd = socket->getDescriptor();
event.events = EPOLLIN | EPOLLONESHOT | EPOLLRDHUP | EPOLLET;
if(socket->needsToWrite())
event.events |= EPOLLWRNORM;
epoll_ctl(epfd, EPOLL_CTL_ADD, event.data.fd, &event);
socket->active = true;
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->active = false;
coreutils::Log(coreutils::LOG_DEBUG_4) << "Disabling socket " << socket->getDescriptor() << " from events.";
}
void EPoll::resetSocket(Socket *socket) {
if(!socket->active)
return;
coreutils::Log(coreutils::LOG_DEBUG_4) << "ResetSocket " << socket;
struct epoll_event event;
event.data.fd = socket->getDescriptor();
event.events = EPOLLIN | EPOLLONESHOT | EPOLLRDHUP | EPOLLET;
if(socket->needsToWrite())
event.events |= EPOLLWRNORM;
epoll_ctl(epfd, EPOLL_CTL_MOD, event.data.fd, &event);
coreutils::Log(coreutils::LOG_DEBUG_4) << "Resetting socket " << socket->getDescriptor() << " for events.";
}
}