Attempt to clean up promises owned by subtasks that have gone away.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3990 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
parent
c0ecdaae12
commit
5b3ae3f006
26
src/task.c
26
src/task.c
@ -56,6 +56,7 @@ typedef struct _promise_t promise_t;
|
|||||||
typedef struct _promise_t
|
typedef struct _promise_t
|
||||||
{
|
{
|
||||||
promiseid_t id;
|
promiseid_t id;
|
||||||
|
taskid_t task;
|
||||||
JSValue values[2];
|
JSValue values[2];
|
||||||
uint32_t stack_hash;
|
uint32_t stack_hash;
|
||||||
} promise_t;
|
} promise_t;
|
||||||
@ -165,6 +166,7 @@ static JSValue _tf_task_trace(JSContext* context, JSValueConst this_val, int arg
|
|||||||
static JSValue _tf_task_getStats(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv);
|
static JSValue _tf_task_getStats(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv);
|
||||||
static JSValue _tf_task_getFile(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv);
|
static JSValue _tf_task_getFile(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv);
|
||||||
|
|
||||||
|
static promise_t* _tf_task_find_promise(tf_task_t* task, promiseid_t id);
|
||||||
static void _tf_task_sendPromiseResolve(tf_task_t* from, tf_taskstub_t* to, promiseid_t promise, JSValue result);
|
static void _tf_task_sendPromiseResolve(tf_task_t* from, tf_taskstub_t* to, promiseid_t promise, JSValue result);
|
||||||
static void _tf_task_sendPromiseReject(tf_task_t* from, tf_taskstub_t* to, promiseid_t promise, JSValue result);
|
static void _tf_task_sendPromiseReject(tf_task_t* from, tf_taskstub_t* to, promiseid_t promise, JSValue result);
|
||||||
|
|
||||||
@ -608,6 +610,11 @@ static void _tf_task_sendPromiseExportMessage(tf_task_t* from, tf_taskstub_t* to
|
|||||||
memcpy(copy, &promise, sizeof(promise));
|
memcpy(copy, &promise, sizeof(promise));
|
||||||
memcpy(copy + sizeof(promise), &exportId, sizeof(exportId));
|
memcpy(copy + sizeof(promise), &exportId, sizeof(exportId));
|
||||||
memcpy(copy + sizeof(promise) + sizeof(exportId), buffer, size);
|
memcpy(copy + sizeof(promise) + sizeof(exportId), buffer, size);
|
||||||
|
promise_t* found = _tf_task_find_promise(from, promise);
|
||||||
|
if (found)
|
||||||
|
{
|
||||||
|
found->task = tf_taskstub_get_id(to);
|
||||||
|
}
|
||||||
tf_packetstream_send(tf_taskstub_get_stream(to), messageType, copy, sizeof(promise) + sizeof(exportId) + size);
|
tf_packetstream_send(tf_taskstub_get_stream(to), messageType, copy, sizeof(promise) + sizeof(exportId) + size);
|
||||||
tf_free(buffer);
|
tf_free(buffer);
|
||||||
tf_free(copy);
|
tf_free(copy);
|
||||||
@ -1234,6 +1241,24 @@ void tf_task_reject_promise(tf_task_t* task, promiseid_t promise, JSValue value)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void _promise_release_for_task(tf_task_t* task, taskid_t task_id)
|
||||||
|
{
|
||||||
|
bool more = true;
|
||||||
|
while (more)
|
||||||
|
{
|
||||||
|
more = false;
|
||||||
|
for (int i = 0; i < task->_promise_count; i++)
|
||||||
|
{
|
||||||
|
const promise_t* promise = &task->_promises[i];
|
||||||
|
if (promise->task == task_id)
|
||||||
|
{
|
||||||
|
tf_task_reject_promise(task, promise->id, JS_ThrowInternalError(task->_context, "Task is gone."));
|
||||||
|
more = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
taskid_t tf_task_allocate_task_id(tf_task_t* task, tf_taskstub_t* stub)
|
taskid_t tf_task_allocate_task_id(tf_task_t* task, tf_taskstub_t* stub)
|
||||||
{
|
{
|
||||||
taskid_t id = 0;
|
taskid_t id = 0;
|
||||||
@ -1257,6 +1282,7 @@ void tf_task_remove_child(tf_task_t* task, tf_taskstub_t* child)
|
|||||||
{
|
{
|
||||||
_import_record_release_for_task(task, tf_taskstub_get_id(child));
|
_import_record_release_for_task(task, tf_taskstub_get_id(child));
|
||||||
_export_record_release_for_task(task, tf_taskstub_get_id(child));
|
_export_record_release_for_task(task, tf_taskstub_get_id(child));
|
||||||
|
_promise_release_for_task(task, tf_taskstub_get_id(child));
|
||||||
for (task_child_node_t** it = &task->_children;
|
for (task_child_node_t** it = &task->_children;
|
||||||
*it;
|
*it;
|
||||||
it = &(*it)->next)
|
it = &(*it)->next)
|
||||||
|
Loading…
Reference in New Issue
Block a user