Welcome to mirror list, hosted at ThFree Co, Russian Federation.

github.com/nodejs/node.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorRafael Gonzaga <rafael.nunu@hotmail.com>2022-09-14 15:47:40 +0300
committerRafaelGSS <rafael.nunu@hotmail.com>2022-09-27 01:07:42 +0300
commit75cfb13ea61df8b539cdb3e0533340d3ed775770 (patch)
tree577214f9da2254660ff131c28cfc09dd3579a08f /src
parent9da11426f618b8d29bb0dfc84faa98e4fd711415 (diff)
src: make ReqWrap weak
This commit allows throwing an exception after creating `FSReqCallback` Co-authored-by: Anna Henningsen <anna@addaleax.net> PR-URL: https://github.com/nodejs/node/pull/44074 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: James M Snell <jasnell@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/cares_wrap.cc4
-rw-r--r--src/connection_wrap.cc5
-rw-r--r--src/node_file.cc4
-rw-r--r--src/req_wrap-inl.h13
-rw-r--r--src/tcp_wrap.cc1
-rw-r--r--src/udp_wrap.cc2
6 files changed, 15 insertions, 14 deletions
diff --git a/src/cares_wrap.cc b/src/cares_wrap.cc
index 1757d56d09a..d19705f94e7 100644
--- a/src/cares_wrap.cc
+++ b/src/cares_wrap.cc
@@ -1429,7 +1429,7 @@ static void Query(const FunctionCallbackInfo<Value>& args) {
void AfterGetAddrInfo(uv_getaddrinfo_t* req, int status, struct addrinfo* res) {
auto cleanup = OnScopeLeave([&]() { uv_freeaddrinfo(res); });
- std::unique_ptr<GetAddrInfoReqWrap> req_wrap {
+ BaseObjectPtr<GetAddrInfoReqWrap> req_wrap{
static_cast<GetAddrInfoReqWrap*>(req->data)};
Environment* env = req_wrap->env();
@@ -1502,7 +1502,7 @@ void AfterGetNameInfo(uv_getnameinfo_t* req,
int status,
const char* hostname,
const char* service) {
- std::unique_ptr<GetNameInfoReqWrap> req_wrap {
+ BaseObjectPtr<GetNameInfoReqWrap> req_wrap{
static_cast<GetNameInfoReqWrap*>(req->data)};
Environment* env = req_wrap->env();
diff --git a/src/connection_wrap.cc b/src/connection_wrap.cc
index 29815eee438..8cb6b8e66ce 100644
--- a/src/connection_wrap.cc
+++ b/src/connection_wrap.cc
@@ -77,9 +77,8 @@ void ConnectionWrap<WrapType, UVType>::OnConnection(uv_stream_t* handle,
template <typename WrapType, typename UVType>
void ConnectionWrap<WrapType, UVType>::AfterConnect(uv_connect_t* req,
int status) {
- std::unique_ptr<ConnectWrap> req_wrap
- (static_cast<ConnectWrap*>(req->data));
- CHECK_NOT_NULL(req_wrap);
+ BaseObjectPtr<ConnectWrap> req_wrap{static_cast<ConnectWrap*>(req->data)};
+ CHECK(req_wrap);
WrapType* wrap = static_cast<WrapType*>(req->handle->data);
CHECK_EQ(req_wrap->env(), wrap->env());
Environment* env = wrap->env();
diff --git a/src/node_file.cc b/src/node_file.cc
index 2bbb3791a43..31f58d61c0f 100644
--- a/src/node_file.cc
+++ b/src/node_file.cc
@@ -460,8 +460,8 @@ MaybeLocal<Promise> FileHandle::ClosePromise() {
CloseReq* req = new CloseReq(env(), close_req_obj, promise, object());
auto AfterClose = uv_fs_callback_t{[](uv_fs_t* req) {
- std::unique_ptr<CloseReq> close(CloseReq::from_req(req));
- CHECK_NOT_NULL(close);
+ BaseObjectPtr<CloseReq> close(CloseReq::from_req(req));
+ CHECK(close);
close->file_handle()->AfterClose();
if (!close->env()->can_call_into_js()) return;
Isolate* isolate = close->env()->isolate();
diff --git a/src/req_wrap-inl.h b/src/req_wrap-inl.h
index c905b605cbd..6bb5a58cb85 100644
--- a/src/req_wrap-inl.h
+++ b/src/req_wrap-inl.h
@@ -20,13 +20,12 @@ ReqWrap<T>::ReqWrap(Environment* env,
AsyncWrap::ProviderType provider)
: AsyncWrap(env, object, provider),
ReqWrapBase(env) {
+ MakeWeak();
Reset();
}
template <typename T>
-ReqWrap<T>::~ReqWrap() {
- CHECK_EQ(false, persistent().IsEmpty());
-}
+ReqWrap<T>::~ReqWrap() {}
template <typename T>
void ReqWrap<T>::Dispatched() {
@@ -120,7 +119,8 @@ struct MakeLibuvRequestCallback<ReqT, void(*)(ReqT*, Args...)> {
using F = void(*)(ReqT* req, Args... args);
static void Wrapper(ReqT* req, Args... args) {
- ReqWrap<ReqT>* req_wrap = ReqWrap<ReqT>::from_req(req);
+ BaseObjectPtr<ReqWrap<ReqT>> req_wrap{ReqWrap<ReqT>::from_req(req)};
+ req_wrap->Detach();
req_wrap->env()->DecreaseWaitingRequestCounter();
F original_callback = reinterpret_cast<F>(req_wrap->original_callback_);
original_callback(req, args...);
@@ -138,7 +138,6 @@ template <typename T>
template <typename LibuvFunction, typename... Args>
int ReqWrap<T>::Dispatch(LibuvFunction fn, Args... args) {
Dispatched();
-
// This expands as:
//
// int err = fn(env()->event_loop(), req(), arg1, arg2, Wrapper, arg3, ...)
@@ -158,8 +157,10 @@ int ReqWrap<T>::Dispatch(LibuvFunction fn, Args... args) {
env()->event_loop(),
req(),
MakeLibuvRequestCallback<T, Args>::For(this, args)...);
- if (err >= 0)
+ if (err >= 0) {
+ ClearWeak();
env()->IncreaseWaitingRequestCounter();
+ }
return err;
}
diff --git a/src/tcp_wrap.cc b/src/tcp_wrap.cc
index eda5aedf5a1..307f2d31f02 100644
--- a/src/tcp_wrap.cc
+++ b/src/tcp_wrap.cc
@@ -344,6 +344,7 @@ void TCPWrap::Connect(const FunctionCallbackInfo<Value>& args,
if (err) {
delete req_wrap;
} else {
+ CHECK(args[2]->Uint32Value(env->context()).IsJust());
int port = args[2]->Uint32Value(env->context()).FromJust();
TRACE_EVENT_NESTABLE_ASYNC_BEGIN2(TRACING_CATEGORY_NODE2(net, native),
"connect",
diff --git a/src/udp_wrap.cc b/src/udp_wrap.cc
index db1548470fa..5ea38f6732d 100644
--- a/src/udp_wrap.cc
+++ b/src/udp_wrap.cc
@@ -669,7 +669,7 @@ int UDPWrap::RecvStop() {
void UDPWrap::OnSendDone(ReqWrap<uv_udp_send_t>* req, int status) {
- std::unique_ptr<SendWrap> req_wrap{static_cast<SendWrap*>(req)};
+ BaseObjectPtr<SendWrap> req_wrap{static_cast<SendWrap*>(req)};
if (req_wrap->have_callback()) {
Environment* env = req_wrap->env();
HandleScope handle_scope(env->isolate());