mirror of
https://github.com/typesense/typesense.git
synced 2025-05-18 12:42:50 +08:00
Free h2o related resources to have a clean shutdown. [Valgrind]
This commit is contained in:
parent
7fc26d0799
commit
d132098463
@ -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>
|
||||
|
@ -80,7 +80,7 @@ public:
|
||||
|
||||
int run();
|
||||
|
||||
void stop(void (*callback)(void));
|
||||
void stop();
|
||||
|
||||
static void on_stop_server(void *data);
|
||||
|
||||
|
@ -2,6 +2,8 @@
|
||||
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <mutex>
|
||||
#include <condition_variable>
|
||||
#include <art.h>
|
||||
#include <number.h>
|
||||
#include <sparsepp.h>
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user