Skip to content

Commit 3dcdda2

Browse files
committed
kernel/pipe: fix releasing writers after a blocking write
1 parent 0bee3dc commit 3dcdda2

File tree

1 file changed

+12
-5
lines changed

1 file changed

+12
-5
lines changed

src/kernel/pipe.ts

Lines changed: 12 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,7 @@ export class Pipe {
4949
this.buf = new Buffer(0);
5050
else
5151
this.buf = this.buf.slice(off + n);
52+
releaseWriter();
5253
return cb(undefined, n);
5354
}
5455
// at this point, we're waiting on more data or an EOF.
@@ -58,12 +59,8 @@ export class Pipe {
5859
this.buf = new Buffer(0);
5960
else
6061
this.buf = this.buf.slice(off + n);
62+
releaseWriter();
6163
cb(undefined, n);
62-
if (this.writeWaiter) {
63-
let waiter = this.writeWaiter;
64-
this.writeWaiter = undefined;
65-
waiter();
66-
}
6764
};
6865
}
6966

@@ -88,6 +85,16 @@ export class Pipe {
8885
this.readWaiter();
8986
this.readWaiter = undefined;
9087
}
88+
89+
// if any writers are blocked (because the buffer was at
90+
// capacity) unblock them
91+
private releaseWriter(): void {
92+
if (this.writeWaiter) {
93+
let waiter = this.writeWaiter;
94+
this.writeWaiter = undefined;
95+
waiter();
96+
}
97+
}
9198
}
9299

93100
export function isPipe(f: IFile): f is PipeFile {

0 commit comments

Comments
 (0)