Free h2o related resources to have a clean shutdown. [Valgrind]

This commit is contained in:
Kishore Nallan 2017-11-19 20:41:31 +05:30
parent 7fc26d0799
commit d132098463
5 changed files with 26 additions and 15 deletions

View File

@ -1,8 +1,11 @@
#pragma once
#include <string>
#include <vector>
#include <string>
#include <thread>
#include <mutex>
#include <condition_variable>
#include <art.h>
#include <index.h>
#include <number.h>

View File

@ -80,7 +80,7 @@ public:
int run();
void stop(void (*callback)(void));
void stop();
static void on_stop_server(void *data);

View File

@ -2,6 +2,8 @@
#include <string>
#include <vector>
#include <mutex>
#include <condition_variable>
#include <art.h>
#include <number.h>
#include <sparsepp.h>

View File

@ -92,20 +92,19 @@ int HttpServer::run() {
}
void HttpServer::on_stop_server(void *data) {
auto callback = reinterpret_cast<void (*)(void)>(data);
callback();
// do nothing
}
void HttpServer::stop(void (*callback)(void)) {
void HttpServer::stop() {
// this will break the event loop
exit_loop = true;
h2o_socket_read_stop(listener_socket);
h2o_socket_close(listener_socket);
send_message(STOP_SERVER_MESSAGE, (void *)callback);
// send a message to activate idle event loop, just in case
send_message(STOP_SERVER_MESSAGE, nullptr);
}
void HttpServer::on_message(h2o_multithread_receiver_t *receiver, h2o_linklist_t *messages) {
while (!h2o_linklist_is_empty(messages)) {
h2o_generator_t generator = {NULL, NULL};
h2o_multithread_message_t *message = H2O_STRUCT_FROM_MEMBER(h2o_multithread_message_t, link, messages->next);
h2o_custom_res_message_t *custom_message = reinterpret_cast<h2o_custom_res_message_t*>(message);
@ -325,11 +324,20 @@ void HttpServer::on(const std::string & message, void (*handler)(void*)) {
}
HttpServer::~HttpServer() {
h2o_socket_read_stop(listener_socket);
h2o_socket_close(listener_socket);
// drain all existing messages
on_message(message_receiver, &message_receiver->_messages);
h2o_multithread_unregister_receiver(message_queue, message_receiver);
h2o_multithread_destroy_queue(message_queue);
free(message_queue);
delete message_receiver;
h2o_context_dispose(&ctx);
free(ctx.globalconf->server_name.base);
free(ctx.queue);
h2o_evloop_destroy(ctx.loop);
h2o_config_dispose(&config);
delete accept_ctx;

View File

@ -11,15 +11,10 @@
HttpServer* server;
void free_resources() {
CollectionManager::get_instance().dispose();
delete server;
}
void catch_interrupt(int sig) {
std::cout << "Stopping Typesense server...1" << std::endl;
std::cout << "Stopping Typesense server..." << std::endl;
signal(sig, SIG_IGN); // ignore for now as we want to shut down elegantly
server->stop(&free_resources);
server->stop();
}
int main(int argc, char **argv) {
@ -88,5 +83,8 @@ int main(int argc, char **argv) {
server->run();
// we are out of the event loop here
delete server;
CollectionManager::get_instance().dispose();
return 0;
}