// Process each client where we have socket activity.
for (int i = 0; i < nfds; ++i) {
- Client *client = reinterpret_cast<Client *>(events[i].data.u64);
+ Client *client = reinterpret_cast<Client *>(events[i].data.ptr);
if (events[i].events & (EPOLLERR | EPOLLRDHUP | EPOLLHUP)) {
close_client(client);
// EPOLLOUT will be added once we go out of READING_REQUEST.
ev.events = EPOLLIN | EPOLLET | EPOLLRDHUP;
}
- ev.data.u64 = reinterpret_cast<uint64_t>(client_ptr);
+ ev.data.ptr = client_ptr;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, sock, &ev) == -1) {
log_perror("epoll_ctl(EPOLL_CTL_ADD)");
exit(1);
// the sleeping array again soon.
ev.events = EPOLLOUT | EPOLLET | EPOLLRDHUP;
}
- ev.data.u64 = reinterpret_cast<uint64_t>(client_ptr);
+ ev.data.ptr = client_ptr;
if (epoll_ctl(epoll_fd, EPOLL_CTL_ADD, client.sock(), &ev) == -1) {
log_perror("epoll_ctl(EPOLL_CTL_ADD)");
exit(1);
// Switch states.
client->state = Client::SENDING_HEADER;
-
- epoll_event ev;
- ev.events = EPOLLOUT | EPOLLET | EPOLLRDHUP;
- ev.data.u64 = reinterpret_cast<uint64_t>(client);
-
- if (epoll_ctl(epoll_fd, EPOLL_CTL_MOD, client->sock, &ev) == -1) {
- log_perror("epoll_ctl(EPOLL_CTL_MOD)");
- exit(1);
- }
+ change_epoll_events(client, EPOLLOUT | EPOLLET | EPOLLRDHUP);
}
void Server::construct_error(Client *client, int error_code)
// Switch states.
client->state = Client::SENDING_SHORT_RESPONSE;
-
- epoll_event ev;
- ev.events = EPOLLOUT | EPOLLET | EPOLLRDHUP;
- ev.data.u64 = reinterpret_cast<uint64_t>(client);
-
- if (epoll_ctl(epoll_fd, EPOLL_CTL_MOD, client->sock, &ev) == -1) {
- log_perror("epoll_ctl(EPOLL_CTL_MOD)");
- exit(1);
- }
+ change_epoll_events(client, EPOLLOUT | EPOLLET | EPOLLRDHUP);
}
void Server::construct_204(Client *client)
// Switch states.
client->state = Client::SENDING_SHORT_RESPONSE;
-
- epoll_event ev;
- ev.events = EPOLLOUT | EPOLLET | EPOLLRDHUP;
- ev.data.u64 = reinterpret_cast<uint64_t>(client);
-
- if (epoll_ctl(epoll_fd, EPOLL_CTL_MOD, client->sock, &ev) == -1) {
- log_perror("epoll_ctl(EPOLL_CTL_MOD)");
- exit(1);
- }
+ change_epoll_events(client, EPOLLOUT | EPOLLET | EPOLLRDHUP);
}
template<class T>
delete_from(&client->stream->to_process, client);
}
+ if (client->tls_context) {
+ tls_destroy_context(client->tls_context);
+ }
+
// Log to access_log.
access_log->write(client->get_stats());
clients.erase(client->sock);
}
-
+
+void Server::change_epoll_events(Client *client, uint32_t events)
+{
+ epoll_event ev;
+ ev.events = events;
+ ev.data.ptr = client;
+
+ if (epoll_ctl(epoll_fd, EPOLL_CTL_MOD, client->sock, &ev) == -1) {
+ log_perror("epoll_ctl(EPOLL_CTL_MOD)");
+ exit(1);
+ }
+}
+
void Server::process_queued_data()
{
{