Fix socket leaks.
git-svn-id: https://www.unprompted.com/svn/projects/tildefriends/trunk@3818 ed5197a5-7fde-0310-b194-c3ffbd925b24
This commit is contained in:
parent
e85ee5766b
commit
8ecc07452e
@ -169,28 +169,49 @@ JSValue _socket_create(JSContext* context, JSValueConst this_val, int argc, JSVa
|
|||||||
return _socket_create_internal(context)->_object;
|
return _socket_create_internal(context)->_object;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _socket_close_internal(socket_t* socket)
|
||||||
|
{
|
||||||
|
if (!JS_IsUndefined(socket->_onRead))
|
||||||
|
{
|
||||||
|
JSValue value = socket->_onRead;
|
||||||
|
socket->_onRead = JS_UNDEFINED;
|
||||||
|
JS_FreeValue(tf_task_get_context(socket->_task), value);
|
||||||
|
}
|
||||||
|
if (!JS_IsUndefined(socket->_onError))
|
||||||
|
{
|
||||||
|
JSValue value = socket->_onError;
|
||||||
|
socket->_onError = JS_UNDEFINED;
|
||||||
|
JS_FreeValue(tf_task_get_context(socket->_task), value);
|
||||||
|
}
|
||||||
|
if (!JS_IsUndefined(socket->_onConnect))
|
||||||
|
{
|
||||||
|
JSValue value = socket->_onConnect;
|
||||||
|
socket->_onConnect = JS_UNDEFINED;
|
||||||
|
JS_FreeValue(tf_task_get_context(socket->_task), value);
|
||||||
|
}
|
||||||
|
if (socket->_tls)
|
||||||
|
{
|
||||||
|
tf_tls_session_destroy(socket->_tls);
|
||||||
|
socket->_tls = NULL;
|
||||||
|
}
|
||||||
|
if (!uv_is_closing((uv_handle_t*)&socket->_socket))
|
||||||
|
{
|
||||||
|
uv_close((uv_handle_t*)&socket->_socket, _socket_onClose);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!socket->_socket.data &&
|
||||||
|
JS_IsUndefined(socket->_object))
|
||||||
|
{
|
||||||
|
--_count;
|
||||||
|
free(socket);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _socket_finalizer(JSRuntime *runtime, JSValue value)
|
void _socket_finalizer(JSRuntime *runtime, JSValue value)
|
||||||
{
|
{
|
||||||
socket_t* socket = JS_GetOpaque(value, _classId);
|
socket_t* socket = JS_GetOpaque(value, _classId);
|
||||||
--_count;
|
socket->_object = JS_UNDEFINED;
|
||||||
free(socket);
|
_socket_close_internal(socket);
|
||||||
}
|
|
||||||
|
|
||||||
void _socket_close_internal(socket_t* socket)
|
|
||||||
{
|
|
||||||
if (!uv_is_closing((uv_handle_t*)&socket->_socket))
|
|
||||||
{
|
|
||||||
JS_FreeValue(tf_task_get_context(socket->_task), socket->_onRead);
|
|
||||||
socket->_onRead = JS_UNDEFINED;
|
|
||||||
JS_FreeValue(tf_task_get_context(socket->_task), socket->_onError);
|
|
||||||
socket->_onError = JS_UNDEFINED;
|
|
||||||
if (socket->_tls)
|
|
||||||
{
|
|
||||||
tf_tls_session_destroy(socket->_tls);
|
|
||||||
socket->_tls = NULL;
|
|
||||||
}
|
|
||||||
uv_close((uv_handle_t*)&socket->_socket, _socket_onClose);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _socket_reportError(socket_t* socket, const char* error)
|
void _socket_reportError(socket_t* socket, const char* error)
|
||||||
@ -522,6 +543,7 @@ JSValue _socket_accept(JSContext* context, JSValueConst this_val, int argc, JSVa
|
|||||||
snprintf(error, sizeof(error), "uv_accept: %s", uv_strerror(status));
|
snprintf(error, sizeof(error), "uv_accept: %s", uv_strerror(status));
|
||||||
tf_task_reject_promise(socket->_task, promise, JS_ThrowInternalError(context, error));
|
tf_task_reject_promise(socket->_task, promise, JS_ThrowInternalError(context, error));
|
||||||
}
|
}
|
||||||
|
JS_FreeValue(context, client->_object);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -885,6 +907,7 @@ void _socket_onClose(uv_handle_t* handle)
|
|||||||
{
|
{
|
||||||
--_open_count;
|
--_open_count;
|
||||||
socket_t* socket = handle->data;
|
socket_t* socket = handle->data;
|
||||||
|
handle->data = NULL;
|
||||||
if (socket->_closePromise != -1)
|
if (socket->_closePromise != -1)
|
||||||
{
|
{
|
||||||
promiseid_t promise = socket->_closePromise;
|
promiseid_t promise = socket->_closePromise;
|
||||||
@ -892,6 +915,14 @@ void _socket_onClose(uv_handle_t* handle)
|
|||||||
socket->_connected = false;
|
socket->_connected = false;
|
||||||
tf_task_resolve_promise(socket->_task, promise, JS_UNDEFINED);
|
tf_task_resolve_promise(socket->_task, promise, JS_UNDEFINED);
|
||||||
}
|
}
|
||||||
|
if (socket->_startTlsPromise != -1)
|
||||||
|
{
|
||||||
|
promiseid_t promise = socket->_startTlsPromise;
|
||||||
|
socket->_startTlsPromise = -1;
|
||||||
|
socket->_connected = false;
|
||||||
|
tf_task_resolve_promise(socket->_task, promise, JS_UNDEFINED);
|
||||||
|
}
|
||||||
|
_socket_close_internal(socket);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _socket_onShutdown(uv_shutdown_t* request, int status)
|
void _socket_onShutdown(uv_shutdown_t* request, int status)
|
||||||
|
@ -260,7 +260,7 @@ static void _tf_ssb_connection_on_tcp_alloc(uv_handle_t* handle, size_t suggeste
|
|||||||
{
|
{
|
||||||
tf_ssb_connection_t* connection = handle->data;
|
tf_ssb_connection_t* connection = handle->data;
|
||||||
size_t malloc_size = sizeof(connection->recv_buffer) - connection->recv_size;
|
size_t malloc_size = sizeof(connection->recv_buffer) - connection->recv_size;
|
||||||
buf->base = malloc(malloc_size);
|
buf->base = malloc_size ? malloc(malloc_size) : NULL;
|
||||||
buf->len = malloc_size;
|
buf->len = malloc_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -2200,7 +2200,7 @@ static void _tf_ssb_on_broadcast_listener_alloc(uv_handle_t* handle, size_t sugg
|
|||||||
{
|
{
|
||||||
tf_ssb_connection_t* connection = handle->data;
|
tf_ssb_connection_t* connection = handle->data;
|
||||||
size_t malloc_size = sizeof(connection->recv_buffer) - connection->recv_size;
|
size_t malloc_size = sizeof(connection->recv_buffer) - connection->recv_size;
|
||||||
buf->base = malloc(malloc_size);
|
buf->base = malloc_size ? malloc(malloc_size) : NULL;
|
||||||
buf->len = malloc_size;
|
buf->len = malloc_size;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user