Created
June 15, 2010 20:35
-
-
Save pgriess/439690 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
- Without this, recvMsg can be invoked before the event emitter gets a | |
chance to run. In this case, recvMsg.fd will be overwritten and the | |
original caller can end up emitting null. | |
--- | |
lib/net.js | 20 ++++++++++++++------ | |
1 files changed, 14 insertions(+), 6 deletions(-) | |
diff --git a/lib/net.js b/lib/net.js | |
index 24e1f7a..ac5f568 100644 | |
--- a/lib/net.js | |
+++ b/lib/net.js | |
@@ -294,13 +294,21 @@ function setImplmentationMethods (self) { | |
self._readImpl = function(buf, off, len, calledByIOWatcher) { | |
var bytesRead = recvMsg(self.fd, buf, off, len); | |
- // Do not emit this in the same stack, otherwise we risk corrupting | |
- // our buffer pool which is full of read data, but has not had | |
- // had its pointers updated just yet. | |
+ // Do not emit this in the same stack, otherwise we risk corrupting our | |
+ // buffer pool which is full of read data, but has not had had its | |
+ // pointers updated just yet. | |
+ // | |
+ // Save off recvMsg.fd in a closure so that, when we emit it later, we're | |
+ // emitting the same value that we see now. Otherwise, we can end up | |
+ // calling emit() after recvMsg() has been called again and end up | |
+ // emitting null (or another FD). | |
if (recvMsg.fd !== null) { | |
- process.nextTick(function() { | |
- self.emit('fd', recvMsg.fd); | |
- }); | |
+ (function () { | |
+ var fd = recvMsg.fd; | |
+ process.nextTick(function() { | |
+ self.emit('fd', fd); | |
+ }); | |
+ })(); | |
} | |
return bytesRead; | |
-- | |
1.7.1 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment