| FazBrowse GitHub Viewer | Trending | | Home |
| Tools: [Download Repo ZIP] [Original HTTPS Page] |
1 parent 2cc54e1 commit fbb3960
3 files changed
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -916,6 +916,7 @@ class FdEntry final : public EntryImpl { | |||
| 916 | 916 | fs::FileHandle::New(realm->GetBindingData<fs::BindingData>(), | |
| 917 | 917 | file, | |
| 918 | 918 | Local<Object>(), | |
| 919 | + {}, | ||
| 919 | 920 | entry->start_, | |
| 920 | 921 | entry->end_ - entry->start_)), | |
| 921 | 922 | entry); | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -222,9 +222,12 @@ void FSReqBase::MemoryInfo(MemoryTracker* tracker) const { | |||
| 222 | 222 | // collection if necessary. If that happens, a process warning will be | |
| 223 | 223 | // emitted (or a fatal exception will occur if the fd cannot be closed.) | |
| 224 | 224 | FileHandle::FileHandle(BindingData* binding_data, | |
| 225 | - Local<Object> obj, int fd) | ||
| 225 | + Local<Object> obj, | ||
| 226 | + int fd, | ||
| 227 | + std::string original_name) | ||
| 226 | 228 | : AsyncWrap(binding_data->env(), obj, AsyncWrap::PROVIDER_FILEHANDLE), | |
| 227 | 229 | StreamBase(env()), | |
| 230 | + original_name_(std::move(original_name)), | ||
| 228 | 231 | fd_(fd), | |
| 229 | 232 | binding_data_(binding_data) { | |
| 230 | 233 | MakeWeak(); | |
@@ -234,6 +237,7 @@ FileHandle::FileHandle(BindingData* binding_data, | |||
| 234 | 237 | FileHandle* FileHandle::New(BindingData* binding_data, | |
| 235 | 238 | int fd, | |
| 236 | 239 | Local<Object> obj, | |
| 240 | + std::string original_name, | ||
| 237 | 241 | std::optional<int64_t> maybeOffset, | |
| 238 | 242 | std::optional<int64_t> maybeLength) { | |
| 239 | 243 | Environment* env = binding_data->env(); | |
@@ -242,7 +246,7 @@ FileHandle* FileHandle::New(BindingData* binding_data, | |||
| 242 | 246 | .ToLocal(&obj)) { | |
| 243 | 247 | return nullptr; | |
| 244 | 248 | } | |
| 245 | - auto handle = new FileHandle(binding_data, obj, fd); | ||
| 249 | + auto handle = new FileHandle(binding_data, obj, fd, original_name); | ||
| 246 | 250 | if (maybeOffset.has_value()) handle->read_offset_ = maybeOffset.value(); | |
| 247 | 251 | if (maybeLength.has_value()) handle->read_length_ = maybeLength.value(); | |
| 248 | 252 | return handle; | |
@@ -274,6 +278,7 @@ void FileHandle::New(const FunctionCallbackInfo<Value>& args) { | |||
| 274 | 278 | FileHandle::New(binding_data, | |
| 275 | 279 | args[0].As<Int32>()->Value(), | |
| 276 | 280 | args.This(), | |
| 281 | + {}, | ||
| 277 | 282 | maybeOffset, | |
| 278 | 283 | maybeLength); | |
| 279 | 284 | } | |
@@ -293,6 +298,7 @@ int FileHandle::DoWrite(WriteWrap* w, | |||
| 293 | 298 | ||
| 294 | 299 | void FileHandle::MemoryInfo(MemoryTracker* tracker) const { | |
| 295 | 300 | tracker->TrackField("current_read", current_read_); | |
| 301 | + tracker->TrackField("original_name", original_name_); | ||
| 296 | 302 | } | |
| 297 | 303 | ||
| 298 | 304 | BaseObject::TransferMode FileHandle::GetTransferMode() const { | |
@@ -346,25 +352,28 @@ inline void FileHandle::Close() { | |||
| 346 | 352 | FS_SYNC_TRACE_END(close); | |
| 347 | 353 | uv_fs_req_cleanup(&req); | |
| 348 | 354 | ||
| 349 | - struct err_detail { int ret; int fd; }; | ||
| 355 | + struct err_detail { | ||
| 356 | + int ret; | ||
| 357 | + int fd; | ||
| 358 | + std::string name; | ||
| 359 | + }; | ||
| 350 | 360 | ||
| 351 | - err_detail detail { ret, fd_ }; | ||
| 361 | + err_detail detail{ret, fd_, original_name_}; | ||
| 352 | 362 | ||
| 353 | 363 | AfterClose(); | |
| 354 | 364 | ||
| 355 | 365 | if (ret < 0) { | |
| 356 | 366 | // Do not unref this | |
| 357 | 367 | env()->SetImmediate([detail](Environment* env) { | |
| 358 | - char msg[70]; | ||
| 359 | - snprintf(msg, arraysize(msg), | ||
| 360 | - "Closing file descriptor %d on garbage collection failed", | ||
| 361 | - detail.fd); | ||
| 362 | - // This exception will end up being fatal for the process because | ||
| 363 | - // it is being thrown from within the SetImmediate handler and | ||
| 364 | - // there is no JS stack to bubble it to. In other words, tearing | ||
| 365 | - // down the process is the only reasonable thing we can do here. | ||
| 366 | 368 | HandleScope handle_scope(env->isolate()); | |
| 367 | - env->ThrowUVException(detail.ret, "close", msg); | ||
| 369 | + static constexpr std::string_view unknown_path = "<unknown path>"; | ||
| 370 | + std::string_view filename = | ||
| 371 | + detail.name.empty() ? unknown_path : detail.name; | ||
| 372 | + auto formatted = SPrintF( | ||
| 373 | + "Closing file descriptor %d on garbage collection failed (%s)", | ||
| 374 | + detail.fd, | ||
| 375 | + filename); | ||
| 376 | + env->ThrowUVException(detail.ret, "close", formatted.c_str()); | ||
| 368 | 377 | }); | |
| 369 | 378 | return; | |
| 370 | 379 | } | |
@@ -846,8 +855,8 @@ void AfterOpenFileHandle(uv_fs_t* req) { | |||
| 846 | 855 | FS_ASYNC_TRACE_END1( | |
| 847 | 856 | req->fs_type, req_wrap, "result", static_cast<int>(req->result)) | |
| 848 | 857 | if (after.Proceed()) { | |
| 849 | - FileHandle* fd = FileHandle::New(req_wrap->binding_data(), | ||
| 850 | - static_cast<int>(req->result)); | ||
| 858 | + FileHandle* fd = FileHandle::New( | ||
| 859 | + req_wrap->binding_data(), static_cast<int>(req->result), {}, req->path); | ||
| 851 | 860 | if (fd == nullptr) return; | |
| 852 | 861 | req_wrap->Resolve(fd->object()); | |
| 853 | 862 | } | |
@@ -2277,7 +2286,7 @@ static void OpenFileHandle(const FunctionCallbackInfo<Value>& args) { | |||
| 2277 | 2286 | if (result < 0) { | |
| 2278 | 2287 | return; // syscall failed, no need to continue, error info is in ctx | |
| 2279 | 2288 | } | |
| 2280 | - FileHandle* fd = FileHandle::New(binding_data, result); | ||
| 2289 | + FileHandle* fd = FileHandle::New(binding_data, result, {}, path.ToString()); | ||
| 2281 | 2290 | if (fd == nullptr) return; | |
| 2282 | 2291 | args.GetReturnValue().Set(fd->object()); | |
| 2283 | 2292 | } | |
| Original file line number | Diff line number | Diff line change | |
|---|---|---|---|
@@ -331,6 +331,7 @@ class FileHandle final : public AsyncWrap, public StreamBase { | |||
| 331 | 331 | static FileHandle* New(BindingData* binding_data, | |
| 332 | 332 | int fd, | |
| 333 | 333 | v8::Local<v8::Object> obj = v8::Local<v8::Object>(), | |
| 334 | + std::string original_name = {}, | ||
| 334 | 335 | std::optional<int64_t> maybeOffset = std::nullopt, | |
| 335 | 336 | std::optional<int64_t> maybeLength = std::nullopt); | |
| 336 | 337 | ~FileHandle() override; | |
@@ -397,7 +398,10 @@ class FileHandle final : public AsyncWrap, public StreamBase { | |||
| 397 | 398 | int fd_; | |
| 398 | 399 | }; | |
| 399 | 400 | ||
| 400 | - FileHandle(BindingData* binding_data, v8::Local<v8::Object> obj, int fd); | ||
| 401 | + FileHandle(BindingData* binding_data, | ||
| 402 | + v8::Local<v8::Object> obj, | ||
| 403 | + int fd, | ||
| 404 | + std::string original_name); | ||
| 401 | 405 | ||
| 402 | 406 | // Synchronous close that emits a warning | |
| 403 | 407 | void Close(); | |
@@ -439,6 +443,7 @@ class FileHandle final : public AsyncWrap, public StreamBase { | |||
| 439 | 443 | // Asynchronous close | |
| 440 | 444 | v8::MaybeLocal<v8::Promise> ClosePromise(); | |
| 441 | 445 | ||
| 446 | + std::string original_name_; | ||
| 442 | 447 | int fd_; | |
| 443 | 448 | bool closing_ = false; | |
| 444 | 449 | bool closed_ = false; | |
| Back | FazBrowse Home | New Git URL |
0 commit comments