Make it so we don't have to wait ages for a timer to be able to shutdown with ^C.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@4796 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
2024-01-27 13:48:16 +00:00
parent 48b967f5b6
commit fa06282ff9
4 changed files with 80 additions and 23 deletions

View File

@ -123,7 +123,8 @@ typedef struct _tf_task_t
uv_idle_t idle;
uv_prepare_t prepare;
uv_signal_t signal;
uv_signal_t sig_term;
uv_signal_t sig_int;
export_record_t** _exports;
int _export_count;
@ -1571,8 +1572,9 @@ JSModuleDef* _tf_task_module_loader(JSContext* context, const char* module_name,
return module;
}
static void _tf_task_sigterm(uv_signal_t* signal, int sig)
static void _tf_task_signal_shutdown(uv_signal_t* signal, int sig)
{
tf_printf("Received %s.\n", strsignal(sig));
tf_task_t* task = signal->data;
task->_killed = true;
if (task->_parent)
@ -1626,10 +1628,14 @@ tf_task_t* tf_task_create()
uv_prepare_init(&task->_loop, &task->prepare);
uv_unref((uv_handle_t*)&task->prepare);
uv_idle_start(&task->idle, _tf_task_run_jobs_idle);
task->signal.data = task;
uv_signal_init(&task->_loop, &task->signal);
uv_signal_start(&task->signal, _tf_task_sigterm, SIGTERM);
uv_unref((uv_handle_t*)&task->signal);
task->sig_term.data = task;
uv_signal_init(&task->_loop, &task->sig_term);
uv_signal_start(&task->sig_term, _tf_task_signal_shutdown, SIGTERM);
uv_unref((uv_handle_t*)&task->sig_term);
task->sig_int.data = task;
uv_signal_init(&task->_loop, &task->sig_int);
uv_signal_start(&task->sig_int, _tf_task_signal_shutdown, SIGINT);
uv_unref((uv_handle_t*)&task->sig_int);
return task;
}
@ -1857,14 +1863,17 @@ void tf_task_destroy(tf_task_t* task)
}
uv_close((uv_handle_t*)&task->idle, _tf_task_on_handle_close);
uv_close((uv_handle_t*)&task->prepare, _tf_task_on_handle_close);
uv_signal_stop(&task->signal);
uv_close((uv_handle_t*)&task->signal, _tf_task_on_handle_close);
uv_signal_stop(&task->sig_term);
uv_close((uv_handle_t*)&task->sig_term, _tf_task_on_handle_close);
uv_signal_stop(&task->sig_int);
uv_close((uv_handle_t*)&task->sig_int, _tf_task_on_handle_close);
while (task->trace_timer.data ||
task->gc_timer.data ||
task->idle.data ||
task->prepare.data ||
task->signal.data)
task->sig_term.data ||
task->sig_int.data)
{
uv_run(&task->_loop, UV_RUN_ONCE);
}