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:
27
src/task.c
27
src/task.c
@ -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);
|
||||
}
|
||||
|
Reference in New Issue
Block a user