Skip to content

Commit

Permalink
fs: document why isPerformingIO is required
Browse files Browse the repository at this point in the history
  • Loading branch information
ronag committed Jun 19, 2020
1 parent 5536044 commit 31322ee
Showing 1 changed file with 13 additions and 0 deletions.
13 changes: 13 additions & 0 deletions lib/internal/fs/streams.js
Original file line number Diff line number Diff line change
Expand Up @@ -255,6 +255,12 @@ ReadStream.prototype._read = function(n) {
};

ReadStream.prototype._destroy = function(err, cb) {
// Usually for async io it is safe to close a file descriptor
// even when there are pending operations. However, due to platform
// differences file IO is implemented using synchronous operations
// running in a thread pool. Therefore, file descriptors are not safe
// to close while used in a pending read or write operation. Wait for
// any pending IO (kIsPerformingIO) to complete (kIoDone).
if (this[kIsPerformingIO]) {
this.once(kIoDone, (er) => close(this, err || er, cb));
} else {
Expand Down Expand Up @@ -416,12 +422,19 @@ WriteStream.prototype._writev = function(data, cb) {
};

WriteStream.prototype._destroy = function(err, cb) {
// Usually for async io it is safe to close a file descriptor
// even when there are pending operations. However, due to platform
// differences file IO is implemented using synchronous operations
// running in a thread pool. Therefore, file descriptors are not safe
// to close while used in a pending read or write operation. Wait for
// any pending IO (kIsPerformingIO) to complete (kIoDone).
if (this[kIsPerformingIO]) {
this.once(kIoDone, (er) => close(this, err || er, cb));
} else {
close(this, err, cb);
}
};

WriteStream.prototype.close = function(cb) {
if (cb) {
if (this.closed) {
Expand Down

0 comments on commit 31322ee

Please sign in to comment.