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:
parent
27c2f27708
commit
0bcc7d8c59
@ -114,7 +114,8 @@ static JSValue _file_read_file(JSContext* context, JSValueConst this_val, int ar
|
|||||||
void* task = JS_GetContextOpaque(context);
|
void* task = JS_GetContextOpaque(context);
|
||||||
const char* file_name = JS_ToCString(context, argv[0]);
|
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);
|
uv_fs_t* req = malloc(sizeof(uv_fs_t) + k_file_read_max);
|
||||||
*req = (uv_fs_t)
|
*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)));
|
tf_task_reject_promise(task, promise, JS_ThrowInternalError(context, uv_strerror(result)));
|
||||||
}
|
}
|
||||||
JS_FreeCString(context, file_name);
|
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)
|
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]);
|
buffer = (uint8_t*)JS_ToCStringLen(context, &size, argv[1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
promiseid_t promise = tf_task_allocate_promise(task);
|
promiseid_t promise = -1;
|
||||||
JSValue promise_value = tf_task_get_promise(task, promise);
|
JSValue promise_value = tf_task_allocate_promise(task, &promise);
|
||||||
uv_fs_t* req = malloc(sizeof(uv_fs_t) + sizeof(size_t) + size);
|
uv_fs_t* req = malloc(sizeof(uv_fs_t) + sizeof(size_t) + size);
|
||||||
*req = (uv_fs_t)
|
*req = (uv_fs_t)
|
||||||
{
|
{
|
||||||
@ -234,8 +235,8 @@ static JSValue _file_rename_file(JSContext* context, JSValueConst this_val, int
|
|||||||
void* task = JS_GetContextOpaque(context);
|
void* task = JS_GetContextOpaque(context);
|
||||||
const char* old_name = JS_ToCString(context, argv[0]);
|
const char* old_name = JS_ToCString(context, argv[0]);
|
||||||
const char* new_name = JS_ToCString(context, argv[1]);
|
const char* new_name = JS_ToCString(context, argv[1]);
|
||||||
promiseid_t promise = tf_task_allocate_promise(task);
|
promiseid_t promise = -1;
|
||||||
JSValue promise_value = tf_task_get_promise(task, promise);
|
JSValue promise_value = tf_task_allocate_promise(task, &promise);
|
||||||
uv_fs_t* req = malloc(sizeof(uv_fs_t));
|
uv_fs_t* req = malloc(sizeof(uv_fs_t));
|
||||||
*req = (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);
|
void* task = JS_GetContextOpaque(context);
|
||||||
const char* file_name = JS_ToCString(context, argv[0]);
|
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_get_promise(task, promise);
|
JSValue promise_value = tf_task_allocate_promise(task, &promise);
|
||||||
uv_fs_t* req = malloc(sizeof(uv_fs_t));
|
uv_fs_t* req = malloc(sizeof(uv_fs_t));
|
||||||
*req = (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);
|
void* task = JS_GetContextOpaque(context);
|
||||||
const char* directory = JS_ToCString(context, argv[0]);
|
const char* directory = JS_ToCString(context, argv[0]);
|
||||||
|
|
||||||
promiseid_t promise = tf_task_allocate_promise(task);
|
promiseid_t promise = -1;
|
||||||
JSValue promise_value = tf_task_get_promise(task, promise);
|
JSValue promise_value = tf_task_allocate_promise(task, &promise);
|
||||||
uv_fs_t* req = malloc(sizeof(uv_fs_t));
|
uv_fs_t* req = malloc(sizeof(uv_fs_t));
|
||||||
*req = (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);
|
void* task = JS_GetContextOpaque(context);
|
||||||
const char* directory = JS_ToCString(context, argv[0]);
|
const char* directory = JS_ToCString(context, argv[0]);
|
||||||
|
|
||||||
promiseid_t promise = tf_task_allocate_promise(task);
|
promiseid_t promise = -1;
|
||||||
JSValue promise_value = tf_task_get_promise(task, promise);
|
JSValue promise_value = tf_task_allocate_promise(task, &promise);
|
||||||
uv_fs_t* req = malloc(sizeof(uv_fs_t));
|
uv_fs_t* req = malloc(sizeof(uv_fs_t));
|
||||||
*req = (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);
|
void* task = JS_GetContextOpaque(context);
|
||||||
const char* path = JS_ToCString(context, argv[0]);
|
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));
|
file_stat_t* data = malloc(sizeof(file_stat_t));
|
||||||
data->_task = task;
|
data->_task = task;
|
||||||
@ -332,7 +334,7 @@ JSValue _file_stat(JSContext* context, JSValueConst this_val, int argc, JSValueC
|
|||||||
free(data);
|
free(data);
|
||||||
}
|
}
|
||||||
JS_FreeCString(context, path);
|
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)
|
static double _time_spec_to_double(const uv_timespec_t* time_spec)
|
||||||
|
@ -259,8 +259,7 @@ JSValue _socket_startTls(JSContext* context, JSValueConst this_val, int argc, JS
|
|||||||
{
|
{
|
||||||
tf_tls_session_start_connect(socket->_tls);
|
tf_tls_session_start_connect(socket->_tls);
|
||||||
}
|
}
|
||||||
socket->_startTlsPromise = tf_task_allocate_promise(socket->_task);
|
JSValue result = tf_task_allocate_promise(socket->_task, &socket->_startTlsPromise);
|
||||||
JSValue result = tf_task_get_promise(socket->_task, socket->_startTlsPromise);
|
|
||||||
_socket_processOutgoingTls(socket);
|
_socket_processOutgoingTls(socket);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
@ -349,8 +348,7 @@ JSValue _socket_bind(JSContext* context, JSValueConst this_val, int argc, JSValu
|
|||||||
};
|
};
|
||||||
data->resolver.data = data;
|
data->resolver.data = data;
|
||||||
data->socket = socket;
|
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);
|
int result = uv_getaddrinfo(tf_task_get_loop(socket->_task), &data->resolver, _socket_onResolvedForBind, node, port, &hints);
|
||||||
if (result != 0)
|
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));
|
tf_task_reject_promise(socket->_task, data->promise, JS_ThrowInternalError(tf_task_get_context(socket->_task), error));
|
||||||
free(data);
|
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)
|
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);
|
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));
|
socket_resolve_data_t* data = malloc(sizeof(socket_resolve_data_t));
|
||||||
memset(data, 0, sizeof(*data));
|
memset(data, 0, sizeof(*data));
|
||||||
struct addrinfo hints = {
|
struct addrinfo hints = {
|
||||||
@ -408,20 +404,19 @@ JSValue _socket_connect(JSContext* context, JSValueConst this_val, int argc, JSV
|
|||||||
};
|
};
|
||||||
data->resolver.data = data;
|
data->resolver.data = data;
|
||||||
data->socket = socket;
|
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);
|
int result = uv_getaddrinfo(tf_task_get_loop(socket->_task), &data->resolver, _socket_onResolvedForConnect, node, port, &hints);
|
||||||
if (result != 0)
|
if (result != 0)
|
||||||
{
|
{
|
||||||
char error[256];
|
char error[256];
|
||||||
snprintf(error, sizeof(error), "uv_getaddrinfo: %s", uv_strerror(result));
|
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);
|
free(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
JS_FreeCString(context, node);
|
JS_FreeCString(context, node);
|
||||||
JS_FreeCString(context, port);
|
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)
|
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);
|
socket_t* client = _socket_create_internal(context);
|
||||||
client->_direction = kAccept;
|
client->_direction = kAccept;
|
||||||
promiseid_t promise = tf_task_allocate_promise(socket->_task);
|
promiseid_t promise;
|
||||||
JSValue result = tf_task_get_promise(socket->_task, promise);
|
JSValue result = tf_task_allocate_promise(socket->_task, &promise);
|
||||||
int status = uv_accept((uv_stream_t*)&socket->_socket, (uv_stream_t*)&client->_socket);
|
int status = uv_accept((uv_stream_t*)&socket->_socket, (uv_stream_t*)&client->_socket);
|
||||||
if (status == 0)
|
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);
|
socket_t* socket = JS_GetOpaque(this_val, _classId);
|
||||||
if (socket->_closePromise == -1)
|
if (socket->_closePromise == -1)
|
||||||
{
|
{
|
||||||
socket->_closePromise = tf_task_allocate_promise(socket->_task);
|
JSValue result = tf_task_allocate_promise(socket->_task, &socket->_closePromise);
|
||||||
JSValue result = tf_task_get_promise(socket->_task, socket->_closePromise);
|
|
||||||
_socket_close_internal(socket);
|
_socket_close_internal(socket);
|
||||||
return result;
|
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)
|
JSValue _socket_shutdown(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||||
{
|
{
|
||||||
socket_t* socket = JS_GetOpaque(this_val, _classId);
|
socket_t* socket = JS_GetOpaque(this_val, _classId);
|
||||||
promiseid_t promise = tf_task_allocate_promise(socket->_task);
|
promiseid_t promise = -1;
|
||||||
JSValue result = tf_task_get_promise(socket->_task, promise);
|
JSValue result = tf_task_allocate_promise(socket->_task, &promise);
|
||||||
if (socket->_tls)
|
if (socket->_tls)
|
||||||
{
|
{
|
||||||
_socket_processTlsShutdown(socket, promise);
|
_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_t* socket = JS_GetOpaque(this_val, _classId);
|
||||||
socket->_onRead = JS_DupValue(context, argv[0]);
|
socket->_onRead = JS_DupValue(context, argv[0]);
|
||||||
int result = uv_read_start((uv_stream_t*)&socket->_socket, _socket_allocateBuffer, _socket_onRead);
|
int result = uv_read_start((uv_stream_t*)&socket->_socket, _socket_allocateBuffer, _socket_onRead);
|
||||||
promiseid_t promise = tf_task_allocate_promise(socket->_task);
|
promiseid_t promise = -1;
|
||||||
JSValue read_result = tf_task_get_promise(socket->_task, promise);
|
JSValue read_result = tf_task_allocate_promise(socket->_task, &promise);
|
||||||
if (result != 0)
|
if (result != 0)
|
||||||
{
|
{
|
||||||
char error[256];
|
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)
|
JSValue _socket_write(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||||
{
|
{
|
||||||
socket_t* socket = JS_GetOpaque(this_val, _classId);
|
socket_t* socket = JS_GetOpaque(this_val, _classId);
|
||||||
promiseid_t promise = tf_task_allocate_promise(socket->_task);
|
promiseid_t promise = -1;
|
||||||
JSValue write_result = tf_task_get_promise(socket->_task, promise);
|
JSValue write_result = tf_task_allocate_promise(socket->_task, &promise);
|
||||||
if (!JS_IsUndefined(argv[0]))
|
if (!JS_IsUndefined(argv[0]))
|
||||||
{
|
{
|
||||||
if (socket->_tls)
|
if (socket->_tls)
|
||||||
|
@ -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);
|
tf_taskstub_t* recipient = _tf_task_get_stub(sender, import->_task);
|
||||||
if (recipient)
|
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);
|
_tf_task_sendPromiseExportMessage(sender, recipient, kInvokeExport, promise, import->_export, array);
|
||||||
result = tf_task_get_promise(sender, promise);
|
|
||||||
}
|
}
|
||||||
else
|
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;
|
promiseid_t promiseId;
|
||||||
do {
|
do {
|
||||||
@ -1142,7 +1142,8 @@ promiseid_t tf_task_allocate_promise(tf_task_t* task)
|
|||||||
task->_promises[index] = promise;
|
task->_promises[index] = promise;
|
||||||
task->_promise_count++;
|
task->_promise_count++;
|
||||||
_tf_task_trace_promises(task);
|
_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)
|
void tf_task_resolve_promise(tf_task_t* task, promiseid_t promise, JSValue value)
|
||||||
|
@ -56,7 +56,7 @@ tf_trace_t* tf_task_get_trace(tf_task_t* task);
|
|||||||
void tf_task_run_jobs(tf_task_t* task);
|
void tf_task_run_jobs(tf_task_t* task);
|
||||||
const char* tf_task_get_name(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_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);
|
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);
|
JSValue tf_task_get_promise(tf_task_t* task, promiseid_t promise);
|
||||||
|
@ -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)
|
static JSValue _taskstub_getExports(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||||
{
|
{
|
||||||
tf_taskstub_t* stub = JS_GetOpaque(this_val, _classId);
|
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);
|
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)
|
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)
|
static JSValue _taskstub_execute(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||||
{
|
{
|
||||||
tf_taskstub_t* stub = JS_GetOpaque(this_val, _classId);
|
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]);
|
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)
|
static JSValue _taskstub_kill(JSContext* context, JSValueConst this_val, int argc, JSValueConst* argv)
|
||||||
|
Loading…
Reference in New Issue
Block a user