stream: Return false from push() more properly
authorisaacs <i@izs.me>
Thu, 21 Feb 2013 22:30:36 +0000 (14:30 -0800)
committerisaacs <i@izs.me>
Thu, 21 Feb 2013 23:23:18 +0000 (15:23 -0800)
commita63c28e6eb9659103f58cacfd201576ba4fb8ae5
tree55e5684f384af9bf322168e814adb0e0981cc804
parent3b2e9d26480da0c73a3735314bee5910cb3844ab
stream: Return false from push() more properly

There are cases where a push() call would return true, even though
the thing being pushed was in fact way way larger than the high
water mark, simply because the 'needReadable' was already set, and
would not get unset until nextTick.

In some cases, this could lead to an infinite loop of pushing data
into the buffer, never getting to the 'readable' event which would
unset the needReadable flag.

Fix by splitting up the emitReadable function, so that it always
sets the flag on this tick, even if it defers until nextTick to
actually emit the event.

Also, if we're not ending or already in the process of reading, it
now calls read(0) if we're below the high water mark.  Thus, the
highWaterMark value is the intended amount to buffer up to, and it
is smarter about hitting the target.
lib/_stream_readable.js
test/simple/test-stream-big-push.js [new file with mode: 0644]