Always fetch the promise JSValue and ID when we allocate one. Make it impossible that we've freed it before we return it. Hopefully fixes leaks. Definitely not worse for performance.

git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3758 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
Cory McWilliams 2022-01-14 03:05:37 +00:00
parent 27c2f27708
commit 0bcc7d8c59
5 changed files with 43 additions and 44 deletions

View File

@ -114,7 +114,8 @@ static JSValue _file_read_file(JSContext* context, JSValueConst this_val, int ar
void* task = JS_GetContextOpaque(context);
const char* file_name = JS_ToCString(context, argv[0]);
promiseid_t promise = tf_task_allocate_promise(task);
promiseid_t promise = -1;
JSValue promise_value = tf_task_allocate_promise(task, &promise);
uv_fs_t* req = malloc(sizeof(uv_fs_t) + k_file_read_max);
*req = (uv_fs_t)
{
@ -126,7 +127,7 @@ static JSValue _file_read_file(JSContext* context, JSValueConst this_val, int ar
tf_task_reject_promise(task, promise, JS_ThrowInternalError(context, uv_strerror(result)));
}
JS_FreeCString(context, file_name);
return tf_task_get_promise(task, promise);
return promise_value;
}
static void _file_write_write_callback(uv_fs_t* req)
@ -189,8 +190,8 @@ static JSValue _file_write_file(JSContext* context, JSValueConst this_val, int a
buffer = (uint8_t*)JS_ToCStringLen(context, &size, argv[1]);
}
promiseid_t promise = tf_task_allocate_promise(task);
JSValue promise_value = tf_task_get_promise(task, promise);
promiseid_t promise = -1;
JSValue promise_value = tf_task_allocate_promise(task, &promise);
uv_fs_t* req = malloc(sizeof(uv_fs_t) + sizeof(size_t) + size);
*req = (uv_fs_t)
{
@ -234,8 +235,8 @@ static JSValue _file_rename_file(JSContext* context, JSValueConst this_val, int
void* task = JS_GetContextOpaque(context);
const char* old_name = JS_ToCString(context, argv[0]);
const char* new_name = JS_ToCString(context, argv[1]);
promiseid_t promise = tf_task_allocate_promise(task);
JSValue promise_value = tf_task_get_promise(task, promise);
promiseid_t promise = -1;
JSValue promise_value = tf_task_allocate_promise(task, &promise);
uv_fs_t* req = malloc(sizeof(uv_fs_t));
*req = (uv_fs_t)
{
@ -255,8 +256,8 @@ static JSValue _file_unlink_file(JSContext* context, JSValueConst this_val, int
{
void* task = JS_GetContextOpaque(context);
const char* file_name = JS_ToCString(context, argv[0]);
promiseid_t promise = tf_task_allocate_promise(task);
JSValue promise_value = tf_task_get_promise(task, promise);
promiseid_t promise = -1;
JSValue promise_value = tf_task_allocate_promise(task, &promise);
uv_fs_t* req = malloc(sizeof(uv_fs_t));
*req = (uv_fs_t)
{
@ -276,8 +277,8 @@ JSValue _file_make_directory(JSContext* context, JSValueConst this_val, int argc
void* task = JS_GetContextOpaque(context);
const char* directory = JS_ToCString(context, argv[0]);
promiseid_t promise = tf_task_allocate_promise(task);
JSValue promise_value = tf_task_get_promise(task, promise);
promiseid_t promise = -1;
JSValue promise_value = tf_task_allocate_promise(task, &promise);
uv_fs_t* req = malloc(sizeof(uv_fs_t));
*req = (uv_fs_t)
{
@ -297,8 +298,8 @@ JSValue _file_remove_directory(JSContext* context, JSValueConst this_val, int ar
void* task = JS_GetContextOpaque(context);
const char* directory = JS_ToCString(context, argv[0]);
promiseid_t promise = tf_task_allocate_promise(task);
JSValue promise_value = tf_task_get_promise(task, promise);
promiseid_t promise = -1;
JSValue promise_value = tf_task_allocate_promise(task, &promise);
uv_fs_t* req = malloc(sizeof(uv_fs_t));
*req = (uv_fs_t)
{
@ -317,7 +318,8 @@ JSValue _file_stat(JSContext* context, JSValueConst this_val, int argc, JSValueC
{
void* task = JS_GetContextOpaque(context);
const char* path = JS_ToCString(context, argv[0]);
promiseid_t promise = tf_task_allocate_promise(task);
promiseid_t promise = -1;
JSValue promise_value = tf_task_allocate_promise(task, &promise);
file_stat_t* data = malloc(sizeof(file_stat_t));
data->_task = task;
@ -332,7 +334,7 @@ JSValue _file_stat(JSContext* context, JSValueConst this_val, int argc, JSValueC
free(data);
}
JS_FreeCString(context, path);
return tf_task_get_promise(task, promise);
return promise_value;
}
static double _time_spec_to_double(const uv_timespec_t* time_spec)

View File

@ -259,8 +259,7 @@ JSValue _socket_startTls(JSContext* context, JSValueConst this_val, int argc, JS
{
tf_tls_session_start_connect(socket->_tls);
}
socket->_startTlsPromise = tf_task_allocate_promise(socket->_task);
JSValue result = tf_task_get_promise(socket->_task, socket->_startTlsPromise);
JSValue result = tf_task_allocate_promise(socket->_task, &socket->_startTlsPromise);
_socket_processOutgoingTls(socket);
return result;
}
@ -349,8 +348,7 @@ JSValue _socket_bind(JSContext* context, JSValueConst this_val, int argc, JSValu
};
data->resolver.data = data;
data->socket = socket;
data->promise = tf_task_allocate_promise(socket->_task);
JSValue promise = tf_task_allocate_promise(socket->_task, &data->promise);
int result = uv_getaddrinfo(tf_task_get_loop(socket->_task), &data->resolver, _socket_onResolvedForBind, node, port, &hints);
if (result != 0)
{
@ -359,7 +357,7 @@ JSValue _socket_bind(JSContext* context, JSValueConst this_val, int argc, JSValu
tf_task_reject_promise(socket->_task, data->promise, JS_ThrowInternalError(tf_task_get_context(socket->_task), error));
free(data);
}
return tf_task_get_promise(socket->_task, data->promise);
return promise;
}
void _socket_onResolvedForBind(uv_getaddrinfo_t* resolver, int status, struct addrinfo* result)
@ -397,8 +395,6 @@ JSValue _socket_connect(JSContext* context, JSValueConst this_val, int argc, JSV
strncpy(socket->_peerName, node, sizeof(socket->_peerName) - 1);
promiseid_t promise = tf_task_allocate_promise(socket->_task);
socket_resolve_data_t* data = malloc(sizeof(socket_resolve_data_t));
memset(data, 0, sizeof(*data));
struct addrinfo hints = {
@ -408,20 +404,19 @@ JSValue _socket_connect(JSContext* context, JSValueConst this_val, int argc, JSV
};
data->resolver.data = data;
data->socket = socket;
data->promise = promise;
JSValue promise = tf_task_allocate_promise(socket->_task, &data->promise);
int result = uv_getaddrinfo(tf_task_get_loop(socket->_task), &data->resolver, _socket_onResolvedForConnect, node, port, &hints);
if (result != 0)
{
char error[256];
snprintf(error, sizeof(error), "uv_getaddrinfo: %s", uv_strerror(result));
tf_task_reject_promise(socket->_task, promise, JS_ThrowInternalError(context, "%s", error));
tf_task_reject_promise(socket->_task, data->promise, JS_ThrowInternalError(context, "%s", error));
free(data);
}
JS_FreeCString(context, node);
JS_FreeCString(context, port);
return tf_task_get_promise(socket->_task, promise);
return promise;
}
void _socket_onResolvedForConnect(uv_getaddrinfo_t* resolver, int status, struct addrinfo* result)
@ -515,8 +510,8 @@ JSValue _socket_accept(JSContext* context, JSValueConst this_val, int argc, JSVa
socket_t* client = _socket_create_internal(context);
client->_direction = kAccept;
promiseid_t promise = tf_task_allocate_promise(socket->_task);
JSValue result = tf_task_get_promise(socket->_task, promise);
promiseid_t promise;
JSValue result = tf_task_allocate_promise(socket->_task, &promise);
int status = uv_accept((uv_stream_t*)&socket->_socket, (uv_stream_t*)&client->_socket);
if (status == 0)
{
@ -537,8 +532,7 @@ JSValue _socket_close(JSContext* context, JSValueConst this_val, int argc, JSVal
socket_t* socket = JS_GetOpaque(this_val, _classId);
if (socket->_closePromise == -1)
{
socket->_closePromise = tf_task_allocate_promise(socket->_task);
JSValue result = tf_task_get_promise(socket->_task, socket->_closePromise);
JSValue result = tf_task_allocate_promise(socket->_task, &socket->_closePromise);
_socket_close_internal(socket);
return result;
}
@ -548,8 +542,8 @@ JSValue _socket_close(JSContext* context, JSValueConst this_val, int argc, JSVal
JSValue _socket_shutdown(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
{
socket_t* socket = JS_GetOpaque(this_val, _classId);
promiseid_t promise = tf_task_allocate_promise(socket->_task);
JSValue result = tf_task_get_promise(socket->_task, promise);
promiseid_t promise = -1;
JSValue result = tf_task_allocate_promise(socket->_task, &promise);
if (socket->_tls)
{
_socket_processTlsShutdown(socket, promise);
@ -610,8 +604,8 @@ JSValue _socket_read(JSContext* context, JSValueConst this_val, int argc, JSValu
socket_t* socket = JS_GetOpaque(this_val, _classId);
socket->_onRead = JS_DupValue(context, argv[0]);
int result = uv_read_start((uv_stream_t*)&socket->_socket, _socket_allocateBuffer, _socket_onRead);
promiseid_t promise = tf_task_allocate_promise(socket->_task);
JSValue read_result = tf_task_get_promise(socket->_task, promise);
promiseid_t promise = -1;
JSValue read_result = tf_task_allocate_promise(socket->_task, &promise);
if (result != 0)
{
char error[256];
@ -822,8 +816,8 @@ static int _socket_write_tls(socket_t* socket, promiseid_t promise, const char*
JSValue _socket_write(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
{
socket_t* socket = JS_GetOpaque(this_val, _classId);
promiseid_t promise = tf_task_allocate_promise(socket->_task);
JSValue write_result = tf_task_get_promise(socket->_task, promise);
promiseid_t promise = -1;
JSValue write_result = tf_task_allocate_promise(socket->_task, &promise);
if (!JS_IsUndefined(argv[0]))
{
if (socket->_tls)

View File

@ -406,9 +406,9 @@ static JSValue _import_call(JSContext* context, JSValueConst func_obj, JSValueCo
tf_taskstub_t* recipient = _tf_task_get_stub(sender, import->_task);
if (recipient)
{
promiseid_t promise = tf_task_allocate_promise(sender);
promiseid_t promise = -1;
result = tf_task_allocate_promise(sender, &promise);
_tf_task_sendPromiseExportMessage(sender, recipient, kInvokeExport, promise, import->_export, array);
result = tf_task_get_promise(sender, promise);
}
else
{
@ -1120,7 +1120,7 @@ static void _tf_task_free_promise(tf_task_t* task, promiseid_t id)
}
}
promiseid_t tf_task_allocate_promise(tf_task_t* task)
JSValue tf_task_allocate_promise(tf_task_t* task, promiseid_t* out_promise)
{
promiseid_t promiseId;
do {
@ -1142,7 +1142,8 @@ promiseid_t tf_task_allocate_promise(tf_task_t* task)
task->_promises[index] = promise;
task->_promise_count++;
_tf_task_trace_promises(task);
return promiseId;
*out_promise = promiseId;
return promise.values[0];
}
void tf_task_resolve_promise(tf_task_t* task, promiseid_t promise, JSValue value)

View File

@ -56,7 +56,7 @@ tf_trace_t* tf_task_get_trace(tf_task_t* task);
void tf_task_run_jobs(tf_task_t* task);
const char* tf_task_get_name(tf_task_t* task);
promiseid_t tf_task_allocate_promise(tf_task_t* task);
JSValue tf_task_allocate_promise(tf_task_t* task, promiseid_t* out_promise);
void tf_task_reject_promise(tf_task_t* task, promiseid_t promise, JSValue error);
void tf_task_resolve_promise(tf_task_t* task, promiseid_t promise, JSValue result);
JSValue tf_task_get_promise(tf_task_t* task, promiseid_t promise);

View File

@ -284,9 +284,10 @@ static void _taskstub_on_process_exit(uv_process_t* process, int64_t status, int
static JSValue _taskstub_getExports(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
{
tf_taskstub_t* stub = JS_GetOpaque(this_val, _classId);
promiseid_t promise = tf_task_allocate_promise(stub->_owner);
promiseid_t promise = -1;
JSValue result = tf_task_allocate_promise(stub->_owner, &promise);
tf_task_send_promise_message(stub->_owner, (tf_taskstub_t*)stub, kGetExports, promise, JS_UNDEFINED);
return tf_task_get_promise(stub->_owner, promise);
return result;
}
static JSValue _taskstub_setImports(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
@ -366,9 +367,10 @@ static JSValue _taskstub_activate(JSContext* context, JSValueConst this_val, int
static JSValue _taskstub_execute(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
{
tf_taskstub_t* stub = JS_GetOpaque(this_val, _classId);
promiseid_t promise = tf_task_allocate_promise(stub->_owner);
promiseid_t promise = -1;
JSValue result = tf_task_allocate_promise(stub->_owner, &promise);
tf_task_send_promise_message(stub->_owner, (tf_taskstub_t*)stub, kExecute, promise, argv[0]);
return tf_task_get_promise(stub->_owner, promise);
return result;
}
static JSValue _taskstub_kill(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)