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
diff options
context:
space:
mode:
Diffstat (limited to 'src/node_file.cc')
-rw-r--r--src/node_file.cc34
1 files changed, 34 insertions, 0 deletions
diff --git a/src/node_file.cc b/src/node_file.cc
index c2ed56f43fb..9ed2d2960cf 100644
--- a/src/node_file.cc
+++ b/src/node_file.cc
@@ -190,6 +190,40 @@ void FileHandle::MemoryInfo(MemoryTracker* tracker) const {
tracker->TrackField("current_read", current_read_);
}
+FileHandle::TransferMode FileHandle::GetTransferMode() const {
+ return reading_ || closing_ || closed_ ?
+ TransferMode::kUntransferable : TransferMode::kTransferable;
+}
+
+std::unique_ptr<worker::TransferData> FileHandle::TransferForMessaging() {
+ CHECK_NE(GetTransferMode(), TransferMode::kUntransferable);
+ auto ret = std::make_unique<TransferData>(fd_);
+ closed_ = true;
+ return ret;
+}
+
+FileHandle::TransferData::TransferData(int fd) : fd_(fd) {}
+
+FileHandle::TransferData::~TransferData() {
+ if (fd_ > 0) {
+ uv_fs_t close_req;
+ CHECK_EQ(0, uv_fs_close(nullptr, &close_req, fd_, nullptr));
+ uv_fs_req_cleanup(&close_req);
+ }
+}
+
+BaseObjectPtr<BaseObject> FileHandle::TransferData::Deserialize(
+ Environment* env,
+ v8::Local<v8::Context> context,
+ std::unique_ptr<worker::TransferData> self) {
+ BindingData* bd = Environment::GetBindingData<BindingData>(context);
+ if (bd == nullptr) return {};
+
+ int fd = fd_;
+ fd_ = -1;
+ return BaseObjectPtr<BaseObject> { FileHandle::New(bd, fd) };
+}
+
// Close the file descriptor if it hasn't already been closed. A process
// warning will be emitted using a SetImmediate to avoid calling back to
// JS during GC. If closing the fd fails at this point, a fatal exception