forked from cory/tildefriends
Don't rely on being idle to do anything. Fixes JS job starvation on slow machines more.
This commit is contained in:
parent
6f487100cd
commit
a15bb8e994
44
src/task.c
44
src/task.c
@ -141,8 +141,6 @@ typedef struct _tf_task_t
|
||||
float thread_percent;
|
||||
|
||||
uv_async_t run_jobs_async;
|
||||
uv_idle_t idle;
|
||||
uv_prepare_t prepare;
|
||||
uv_signal_t sig_term;
|
||||
uv_signal_t sig_int;
|
||||
|
||||
@ -209,7 +207,6 @@ static void _tf_task_sendPromiseExportMessage(tf_task_t* from, tf_taskstub_t* to
|
||||
static JSValue _tf_task_executeSource(tf_task_t* task, const char* source, const char* name);
|
||||
static tf_taskstub_t* _tf_task_get_stub(tf_task_t* task, taskid_t id);
|
||||
static void _tf_task_release_export(tf_taskstub_t* stub, exportid_t exportId);
|
||||
static void _tf_task_run_jobs_prepare(uv_prepare_t* prepare);
|
||||
static void _timeout_unlink(tf_task_t* task, timeout_t* timeout);
|
||||
static void _timeout_closed(uv_handle_t* handle);
|
||||
|
||||
@ -1522,28 +1519,6 @@ static bool _tf_task_run_jobs(tf_task_t* task)
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void _tf_task_run_jobs_idle(uv_idle_t* idle)
|
||||
{
|
||||
tf_task_t* task = idle->data;
|
||||
if (!_tf_task_run_jobs(task))
|
||||
{
|
||||
/* No more jobs. Don't try again as actively. */
|
||||
uv_idle_stop(&task->idle);
|
||||
uv_prepare_start(&task->prepare, _tf_task_run_jobs_prepare);
|
||||
}
|
||||
}
|
||||
|
||||
static void _tf_task_run_jobs_prepare(uv_prepare_t* prepare)
|
||||
{
|
||||
tf_task_t* task = prepare->data;
|
||||
if (_tf_task_run_jobs(task))
|
||||
{
|
||||
/* More jobs. We can run again immediately. */
|
||||
uv_idle_start(&task->idle, _tf_task_run_jobs_idle);
|
||||
uv_prepare_stop(&task->prepare);
|
||||
}
|
||||
}
|
||||
|
||||
static void _tf_task_run_jobs_async(uv_async_t* async)
|
||||
{
|
||||
tf_task_t* task = async->data;
|
||||
@ -1553,6 +1528,14 @@ static void _tf_task_run_jobs_async(uv_async_t* async)
|
||||
}
|
||||
}
|
||||
|
||||
void tf_task_check_jobs(tf_task_t* task)
|
||||
{
|
||||
if (JS_IsJobPending(task->_runtime))
|
||||
{
|
||||
uv_async_send(&task->run_jobs_async);
|
||||
}
|
||||
}
|
||||
|
||||
static JSModuleDef* _tf_task_module_loader(JSContext* context, const char* module_name, void* opaque)
|
||||
{
|
||||
tf_task_t* task = opaque;
|
||||
@ -1646,13 +1629,6 @@ tf_task_t* tf_task_create()
|
||||
uv_timer_init(&task->_loop, &task->gc_timer);
|
||||
uv_timer_start(&task->gc_timer, _tf_task_gc_timer, 1000, 1000);
|
||||
uv_unref((uv_handle_t*)&task->gc_timer);
|
||||
task->idle.data = task;
|
||||
uv_idle_init(&task->_loop, &task->idle);
|
||||
uv_unref((uv_handle_t*)&task->idle);
|
||||
task->prepare.data = task;
|
||||
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->run_jobs_async.data = task;
|
||||
uv_async_init(&task->_loop, &task->run_jobs_async, _tf_task_run_jobs_async);
|
||||
uv_unref((uv_handle_t*)&task->run_jobs_async);
|
||||
@ -1923,15 +1899,13 @@ void tf_task_destroy(tf_task_t* task)
|
||||
{
|
||||
uv_close((uv_handle_t*)&task->gc_timer, _tf_task_on_handle_close);
|
||||
}
|
||||
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_close((uv_handle_t*)&task->run_jobs_async, _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->run_jobs_async.data || task->sig_term.data || task->sig_int.data)
|
||||
while (task->trace_timer.data || task->gc_timer.data || task->run_jobs_async.data || task->sig_term.data || task->sig_int.data)
|
||||
{
|
||||
uv_run(&task->_loop, UV_RUN_ONCE);
|
||||
}
|
||||
|
@ -364,4 +364,11 @@ tf_android_start_service_t* tf_task_get_android_start_service();
|
||||
*/
|
||||
tf_android_stop_service_t* tf_task_get_android_stop_service();
|
||||
|
||||
/**
|
||||
** Check for JS jobs that need to be run. Generally to be called post-JS_Call
|
||||
** in tf_util_report_error.
|
||||
** @param task The task.
|
||||
*/
|
||||
void tf_task_check_jobs(tf_task_t* task);
|
||||
|
||||
/** @} */
|
||||
|
@ -211,6 +211,7 @@ static JSValue _util_print(JSContext* context, JSValueConst this_val, int argc,
|
||||
bool tf_util_report_error(JSContext* context, JSValue value)
|
||||
{
|
||||
bool is_error = false;
|
||||
tf_task_t* task = tf_task_get(context);
|
||||
if (JS_IsError(context, value))
|
||||
{
|
||||
const char* string = JS_ToCString(context, value);
|
||||
@ -226,13 +227,11 @@ bool tf_util_report_error(JSContext* context, JSValue value)
|
||||
}
|
||||
JS_FreeValue(context, stack);
|
||||
|
||||
tf_task_t* task = tf_task_get(context);
|
||||
tf_task_send_error_to_parent(task, value);
|
||||
is_error = true;
|
||||
}
|
||||
else if (JS_IsException(value))
|
||||
{
|
||||
tf_task_t* task = tf_task_get(context);
|
||||
if (!tf_task_send_error_to_parent(task, value))
|
||||
{
|
||||
JSValue exception = JS_GetException(context);
|
||||
@ -241,6 +240,7 @@ bool tf_util_report_error(JSContext* context, JSValue value)
|
||||
}
|
||||
is_error = true;
|
||||
}
|
||||
tf_task_check_jobs(task);
|
||||
return is_error;
|
||||
}
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user