mirror of
https://github.com/nodejs/node.git
synced 2024-11-29 23:16:30 +01:00
53ca0b9ae1
Since worker threads are complete Node.js environments, including the ability to load native addons, and since those native addons can allocate resources to be freed when objects go out of scope, and since, upon worker thread exit, the engine does not invoke the weak callbacks responsible for freeing resources which still have references, this modification introduces tracking for weak references such that a list of outstanding weak references is maintained. This list is traversed during environment teardown. The callbacks for the remaining weak references are called. This change is also relevant for Node.js embedder scenarios, because in those cases the process also outlives the `node::Environment` and therefore weak callbacks should also be rendered as environment cleanup hooks to ensure proper cleanup after native addons. This changes introduces the means by which this can be accomplished. A benchmark is included which measures the time it takes to execute the weak reference callback for a given number of weak references. Re: https://github.com/tc39/proposal-weakrefs/issues/125#issuecomment-535832130 PR-URL: https://github.com/nodejs/node/pull/28428 Reviewed-By: Anna Henningsen <anna@addaleax.net> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
78 lines
2.0 KiB
C++
78 lines
2.0 KiB
C++
#ifndef SRC_JS_NATIVE_API_V8_INTERNALS_H_
|
|
#define SRC_JS_NATIVE_API_V8_INTERNALS_H_
|
|
|
|
// The V8 implementation of N-API, including `js_native_api_v8.h` uses certain
|
|
// idioms which require definition here. For example, it uses a variant of
|
|
// persistent references which need not be reset in the constructor. It is the
|
|
// responsibility of this file to define these idioms. Optionally, this file
|
|
// may also define `NAPI_VERSION` and set it to the version of N-API to be
|
|
// exposed.
|
|
|
|
// In the case of the Node.js implementation of N-API some of the idioms are
|
|
// imported directly from Node.js by including `node_internals.h` below. Others
|
|
// are bridged to remove references to the `node` namespace. `node_version.h`,
|
|
// included below, defines `NAPI_VERSION`.
|
|
|
|
#include "node_version.h"
|
|
#include "env.h"
|
|
#include "node_internals.h"
|
|
|
|
#define NAPI_ARRAYSIZE(array) \
|
|
node::arraysize((array))
|
|
|
|
#define NAPI_FIXED_ONE_BYTE_STRING(isolate, string) \
|
|
node::FIXED_ONE_BYTE_STRING((isolate), (string))
|
|
|
|
#define NAPI_PRIVATE_KEY(context, suffix) \
|
|
(node::Environment::GetCurrent((context))->napi_ ## suffix())
|
|
|
|
namespace v8impl {
|
|
|
|
class RefTracker {
|
|
public:
|
|
RefTracker() {}
|
|
virtual ~RefTracker() {}
|
|
virtual void Finalize(bool isEnvTeardown) {}
|
|
|
|
typedef RefTracker RefList;
|
|
|
|
inline void Link(RefList* list) {
|
|
prev_ = list;
|
|
next_ = list->next_;
|
|
if (next_ != nullptr) {
|
|
next_->prev_ = this;
|
|
}
|
|
list->next_ = this;
|
|
}
|
|
|
|
inline void Unlink() {
|
|
if (prev_ != nullptr) {
|
|
prev_->next_ = next_;
|
|
}
|
|
if (next_ != nullptr) {
|
|
next_->prev_ = prev_;
|
|
}
|
|
prev_ = nullptr;
|
|
next_ = nullptr;
|
|
}
|
|
|
|
static void FinalizeAll(RefList* list) {
|
|
while (list->next_ != nullptr) {
|
|
list->next_->Finalize(true);
|
|
}
|
|
}
|
|
|
|
private:
|
|
RefList* next_ = nullptr;
|
|
RefList* prev_ = nullptr;
|
|
};
|
|
|
|
template <typename T>
|
|
using Persistent = v8::Global<T>;
|
|
|
|
using PersistentToLocal = node::PersistentToLocal;
|
|
|
|
} // end of namespace v8impl
|
|
|
|
#endif // SRC_JS_NATIVE_API_V8_INTERNALS_H_
|