Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
34 changes: 21 additions & 13 deletions src/node_file-inl.h
Original file line number Diff line number Diff line change
Expand Up @@ -209,13 +209,7 @@ FSReqPromise<AliasedBufferT>::FSReqPromise(BindingData* binding_data,
v8::Local<v8::Object> obj,
bool use_bigint)
: FSReqBase(
binding_data, obj, AsyncWrap::PROVIDER_FSREQPROMISE, use_bigint),
stats_field_array_(
env()->isolate(),
static_cast<size_t>(FsStatsOffset::kFsStatsFieldsNumber)),
statfs_field_array_(
env()->isolate(),
static_cast<size_t>(FsStatFsOffset::kFsStatFsFieldsNumber)) {}
binding_data, obj, AsyncWrap::PROVIDER_FSREQPROMISE, use_bigint) {}

template <typename AliasedBufferT>
void FSReqPromise<AliasedBufferT>::Reject(v8::Local<v8::Value> reject) {
Expand Down Expand Up @@ -253,14 +247,24 @@ void FSReqPromise<AliasedBufferT>::Resolve(v8::Local<v8::Value> value) {

template <typename AliasedBufferT>
void FSReqPromise<AliasedBufferT>::ResolveStat(const uv_stat_t* stat) {
FillStatsArray(&stats_field_array_, stat);
Resolve(stats_field_array_.GetJSArray());
if (!stats_field_array_.has_value()) {
stats_field_array_.emplace(
env()->isolate(),
static_cast<size_t>(FsStatsOffset::kFsStatsFieldsNumber));
}
FillStatsArray(&stats_field_array_.value(), stat);
Resolve(stats_field_array_->GetJSArray());
}

template <typename AliasedBufferT>
void FSReqPromise<AliasedBufferT>::ResolveStatFs(const uv_statfs_t* stat) {
FillStatFsArray(&statfs_field_array_, stat);
Resolve(statfs_field_array_.GetJSArray());
if (!statfs_field_array_.has_value()) {
statfs_field_array_.emplace(
env()->isolate(),
static_cast<size_t>(FsStatFsOffset::kFsStatFsFieldsNumber));
}
FillStatFsArray(&statfs_field_array_.value(), stat);
Resolve(statfs_field_array_->GetJSArray());
}

template <typename AliasedBufferT>
Expand All @@ -280,8 +284,12 @@ void FSReqPromise<AliasedBufferT>::SetReturnValue(
template <typename AliasedBufferT>
void FSReqPromise<AliasedBufferT>::MemoryInfo(MemoryTracker* tracker) const {
FSReqBase::MemoryInfo(tracker);
tracker->TrackField("stats_field_array", stats_field_array_);
tracker->TrackField("statfs_field_array", statfs_field_array_);
if (stats_field_array_.has_value()) {
tracker->TrackField("stats_field_array", stats_field_array_.value());
}
if (statfs_field_array_.has_value()) {
tracker->TrackField("statfs_field_array", statfs_field_array_.value());
}
}

FSReqBase* GetReqWrap(const v8::FunctionCallbackInfo<v8::Value>& args,
Expand Down
7 changes: 5 additions & 2 deletions src/node_file.h
Original file line number Diff line number Diff line change
Expand Up @@ -266,8 +266,11 @@ class FSReqPromise final : public FSReqBase {
bool use_bigint);

bool finished_ = false;
AliasedBufferT stats_field_array_;
AliasedBufferT statfs_field_array_;
// Constructed lazily in ResolveStat()/ResolveStatFs(): most operations
// never resolve with stats, and eagerly allocating the backing stores
// for every request is a significant per-request cost.
std::optional<AliasedBufferT> stats_field_array_;
std::optional<AliasedBufferT> statfs_field_array_;
};

class FSReqAfterScope final {
Expand Down
Loading