Merge remote-tracking branch 'ry/v0.6' into master
Conflicts: AUTHORS ChangeLog LICENSE Makefile deps/http_parser/test.c deps/npm/AUTHORS deps/npm/html/api/bin.html deps/npm/html/api/bugs.html deps/npm/html/api/commands.html deps/npm/html/api/config.html deps/npm/html/api/deprecate.html deps/npm/html/api/docs.html deps/npm/html/api/edit.html deps/npm/html/api/explore.html deps/npm/html/api/help-search.html deps/npm/html/api/init.html deps/npm/html/api/install.html deps/npm/html/api/link.html deps/npm/html/api/load.html deps/npm/html/api/ls.html deps/npm/html/api/npm.html deps/npm/html/api/outdated.html deps/npm/html/api/owner.html deps/npm/html/api/pack.html deps/npm/html/api/prefix.html deps/npm/html/api/prune.html deps/npm/html/api/publish.html deps/npm/html/api/rebuild.html deps/npm/html/api/restart.html deps/npm/html/api/root.html deps/npm/html/api/run-script.html deps/npm/html/api/search.html deps/npm/html/api/shrinkwrap.html deps/npm/html/api/start.html deps/npm/html/api/stop.html deps/npm/html/api/submodule.html deps/npm/html/api/tag.html deps/npm/html/api/test.html deps/npm/html/api/uninstall.html deps/npm/html/api/unpublish.html deps/npm/html/api/update.html deps/npm/html/api/version.html deps/npm/html/api/view.html deps/npm/html/api/whoami.html deps/npm/html/doc/README.html deps/npm/html/doc/adduser.html deps/npm/html/doc/bin.html deps/npm/html/doc/bugs.html deps/npm/html/doc/build.html deps/npm/html/doc/bundle.html deps/npm/html/doc/cache.html deps/npm/html/doc/changelog.html deps/npm/html/doc/coding-style.html deps/npm/html/doc/completion.html deps/npm/html/doc/config.html deps/npm/html/doc/deprecate.html deps/npm/html/doc/developers.html deps/npm/html/doc/disputes.html deps/npm/html/doc/docs.html deps/npm/html/doc/edit.html deps/npm/html/doc/explore.html deps/npm/html/doc/faq.html deps/npm/html/doc/folders.html deps/npm/html/doc/help-search.html deps/npm/html/doc/help.html deps/npm/html/doc/index.html deps/npm/html/doc/init.html deps/npm/html/doc/install.html deps/npm/html/doc/json.html deps/npm/html/doc/link.html deps/npm/html/doc/list.html deps/npm/html/doc/npm.html deps/npm/html/doc/outdated.html deps/npm/html/doc/owner.html deps/npm/html/doc/pack.html deps/npm/html/doc/prefix.html deps/npm/html/doc/prune.html deps/npm/html/doc/publish.html deps/npm/html/doc/rebuild.html deps/npm/html/doc/registry.html deps/npm/html/doc/removing-npm.html deps/npm/html/doc/restart.html deps/npm/html/doc/root.html deps/npm/html/doc/run-script.html deps/npm/html/doc/scripts.html deps/npm/html/doc/search.html deps/npm/html/doc/semver.html deps/npm/html/doc/shrinkwrap.html deps/npm/html/doc/star.html deps/npm/html/doc/start.html deps/npm/html/doc/stop.html deps/npm/html/doc/submodule.html deps/npm/html/doc/tag.html deps/npm/html/doc/test.html deps/npm/html/doc/uninstall.html deps/npm/html/doc/unpublish.html deps/npm/html/doc/update.html deps/npm/html/doc/version.html deps/npm/html/doc/view.html deps/npm/html/doc/whoami.html deps/npm/lib/npm.js deps/npm/man/man1/npm.1 deps/npm/man/man3/npm.3 deps/npm/node_modules/fstream-npm/fstream-npm.js deps/npm/node_modules/fstream-npm/node_modules/fstream-ignore/package.json deps/npm/node_modules/fstream-npm/package.json deps/npm/node_modules/node-gyp/LICENSE deps/npm/node_modules/node-gyp/lib/build.js deps/npm/node_modules/node-gyp/lib/install.js deps/npm/node_modules/node-gyp/node_modules/ansi/package.json deps/npm/node_modules/node-gyp/node_modules/glob/package.json deps/npm/node_modules/node-gyp/package.json deps/npm/package.json deps/uv/test/test-fs.c deps/v8/src/regexp-macro-assembler-tracer.cc deps/v8/src/version.cc src/node_version.h src/platform_sunos.cc test/simple/test-net-write-after-close.js wscript
This commit is contained in:
commit
ecca7525cc
1
AUTHORS
1
AUTHORS
@ -300,3 +300,4 @@ Aaron Jacobs <jacobsa@google.com>
|
||||
Mustansir Golawala <mgolawala@gmail.com>
|
||||
fukayatsu <fukayatsu@gmail.com>
|
||||
Domenic Denicola <domenic@domenicdenicola.com>
|
||||
Bryan Cantrill <bryan@joyent.com>
|
||||
|
46
ChangeLog
46
ChangeLog
@ -255,6 +255,52 @@
|
||||
* Bug fixes
|
||||
|
||||
|
||||
2012.04.09 Version 0.6.15 (stable)
|
||||
|
||||
* Update npm to 1.1.16
|
||||
|
||||
* Show licenses in binary installers.
|
||||
|
||||
* unix: add uv_fs_read64, uv_fs_write64 and uv_fs_ftruncate64 (Ben Noordhuis)
|
||||
|
||||
* add 64bit offset fs functions (Igor Zinkovsky)
|
||||
|
||||
* windows: don't report ENOTSOCK when attempting to bind an udp handle twice (Bert Belder)
|
||||
|
||||
* windows: backport pipe-connect-to-file fixes from master (Bert Belder)
|
||||
|
||||
* windows: never call fs event callbacks after closing the watcher (Bert Belder)
|
||||
|
||||
* fs.readFile: don't make the callback before the fd is closed (Bert Belder)
|
||||
|
||||
* windows: use 64bit offsets for uv_fs apis (Igor Zinkovsky)
|
||||
|
||||
* Fix #2061: segmentation fault on OS X due to stat size mismatch (Ben Noordhuis)
|
||||
|
||||
|
||||
2012.03.22 Version 0.6.14 (stable), e513ffef7549a56a5af728e1f0c2c0c8f290518a
|
||||
|
||||
* net: don't crash when queued write fails (Igor Zinkovsky)
|
||||
|
||||
* sunos: fix EMFILE on process.memoryUsage() (Bryan Cantrill)
|
||||
|
||||
* crypto: fix compile-time error with openssl 0.9.7e (Ben Noordhuis)
|
||||
|
||||
* unix: ignore ECONNABORTED errors from accept() (Ben Noordhuis)
|
||||
|
||||
* Add UV_ENOSPC and mappings to it (Bert Belder)
|
||||
|
||||
* http-parser: Fix response body is not read (koichik)
|
||||
|
||||
* Upgrade npm to 1.1.12
|
||||
- upgrade node-gyp to 0.3.7
|
||||
- work around AV-locked directories on Windows
|
||||
- Fix isaacs/npm#2293 Don't try to 'uninstall' /
|
||||
- Exclude symbolic links from packages.
|
||||
- Fix isaacs/npm#2275 Spurious 'unresolvable cycle' error.
|
||||
- Exclude/include dot files as if they were normal files
|
||||
|
||||
|
||||
2012.03.15 Version 0.6.13 (stable), 9f7f86b534f8556290eb8cad915984ff4ca54996
|
||||
|
||||
* Windows: Many libuv test fixes (Bert Belder)
|
||||
|
7
LICENSE
7
LICENSE
@ -361,13 +361,6 @@ maintained libraries. The externally maintained libraries used by Node are:
|
||||
# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
||||
# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||
# OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
# Here are some issues that I've had people identify in my code during reviews,
|
||||
# that I think are possible to flag automatically in a lint tool. If these were
|
||||
# caught by lint, it would save time both for myself and that of my reviewers.
|
||||
# Most likely, some of these are beyond the scope of the current lint framework,
|
||||
# but I think it is valuable to retain these wish-list items even if they cannot
|
||||
# be immediately implemented.
|
||||
"""
|
||||
|
||||
- lib/buffer_ieee754.js. Its license follows:
|
||||
|
7
Makefile
7
Makefile
@ -150,6 +150,13 @@ blog.html: email.md
|
||||
|
||||
website-upload: doc
|
||||
rsync -r out/doc/ node@nodejs.org:~/web/nodejs.org/
|
||||
ssh node@nodejs.org '\
|
||||
rm -f ~/web/nodejs.org/dist/latest &&\
|
||||
ln -s $(VERSION) ~/web/nodejs.org/dist/latest &&\
|
||||
rm -f ~/web/nodejs.org/docs/latest &&\
|
||||
ln -s $(VERSION) ~/web/nodejs.org/docs/latest &&\
|
||||
rm -f ~/web/nodejs.org/dist/node-latest.tar.gz &&\
|
||||
ln -s $(VERSION)/node-$(VERSION).tar.gz ~/web/nodejs.org/dist/node-latest.tar.gz'
|
||||
|
||||
docopen: out/doc/api/all.html
|
||||
-google-chrome out/doc/api/all.html
|
||||
|
1059
deps/http_parser/test.c
vendored
1059
deps/http_parser/test.c
vendored
File diff suppressed because it is too large
Load Diff
64
deps/uv/test/test-fs.c
vendored
64
deps/uv/test/test-fs.c
vendored
@ -225,7 +225,6 @@ static void close_cb(uv_fs_t* req) {
|
||||
uv_fs_req_cleanup(req);
|
||||
if (close_cb_count == 3) {
|
||||
r = uv_fs_unlink(loop, &unlink_req, "test_file2", unlink_cb);
|
||||
ASSERT(r == 0);
|
||||
}
|
||||
}
|
||||
|
||||
@ -238,7 +237,6 @@ static void ftruncate_cb(uv_fs_t* req) {
|
||||
ftruncate_cb_count++;
|
||||
uv_fs_req_cleanup(req);
|
||||
r = uv_fs_close(loop, &close_req, open_req1.result, close_cb);
|
||||
ASSERT(r == 0);
|
||||
}
|
||||
|
||||
|
||||
@ -257,7 +255,6 @@ static void read_cb(uv_fs_t* req) {
|
||||
ASSERT(strcmp(buf, "test-bu") == 0);
|
||||
r = uv_fs_close(loop, &close_req, open_req1.result, close_cb);
|
||||
}
|
||||
ASSERT(r == 0);
|
||||
}
|
||||
|
||||
|
||||
@ -277,7 +274,6 @@ static void open_cb(uv_fs_t* req) {
|
||||
memset(buf, 0, sizeof(buf));
|
||||
r = uv_fs_read(loop, &read_req, open_req1.result, buf, sizeof(buf), -1,
|
||||
read_cb);
|
||||
ASSERT(r == 0);
|
||||
}
|
||||
|
||||
|
||||
@ -302,7 +298,6 @@ static void fsync_cb(uv_fs_t* req) {
|
||||
fsync_cb_count++;
|
||||
uv_fs_req_cleanup(req);
|
||||
r = uv_fs_close(loop, &close_req, open_req1.result, close_cb);
|
||||
ASSERT(r == 0);
|
||||
}
|
||||
|
||||
|
||||
@ -314,7 +309,6 @@ static void fdatasync_cb(uv_fs_t* req) {
|
||||
fdatasync_cb_count++;
|
||||
uv_fs_req_cleanup(req);
|
||||
r = uv_fs_fsync(loop, &fsync_req, open_req1.result, fsync_cb);
|
||||
ASSERT(r == 0);
|
||||
}
|
||||
|
||||
|
||||
@ -326,7 +320,6 @@ static void write_cb(uv_fs_t* req) {
|
||||
write_cb_count++;
|
||||
uv_fs_req_cleanup(req);
|
||||
r = uv_fs_fdatasync(loop, &fdatasync_req, open_req1.result, fdatasync_cb);
|
||||
ASSERT(r == 0);
|
||||
}
|
||||
|
||||
|
||||
@ -339,7 +332,6 @@ static void create_cb(uv_fs_t* req) {
|
||||
uv_fs_req_cleanup(req);
|
||||
r = uv_fs_write(loop, &write_req, req->result, test_buf, sizeof(test_buf),
|
||||
-1, write_cb);
|
||||
ASSERT(r == 0);
|
||||
}
|
||||
|
||||
|
||||
@ -1673,59 +1665,3 @@ TEST_IMPL(fs_rename_to_existing_file) {
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
TEST_IMPL(fs_read_file_eof) {
|
||||
int r;
|
||||
|
||||
/* Setup. */
|
||||
unlink("test_file");
|
||||
|
||||
loop = uv_default_loop();
|
||||
|
||||
r = uv_fs_open(loop, &open_req1, "test_file", O_WRONLY | O_CREAT,
|
||||
S_IWRITE | S_IREAD, NULL);
|
||||
ASSERT(r != -1);
|
||||
ASSERT(open_req1.result != -1);
|
||||
uv_fs_req_cleanup(&open_req1);
|
||||
|
||||
r = uv_fs_write(loop, &write_req, open_req1.result, test_buf,
|
||||
sizeof(test_buf), -1, NULL);
|
||||
ASSERT(r != -1);
|
||||
ASSERT(write_req.result != -1);
|
||||
uv_fs_req_cleanup(&write_req);
|
||||
|
||||
r = uv_fs_close(loop, &close_req, open_req1.result, NULL);
|
||||
ASSERT(r != -1);
|
||||
ASSERT(close_req.result != -1);
|
||||
uv_fs_req_cleanup(&close_req);
|
||||
|
||||
r = uv_fs_open(loop, &open_req1, "test_file", O_RDONLY, 0, NULL);
|
||||
ASSERT(r != -1);
|
||||
ASSERT(open_req1.result != -1);
|
||||
uv_fs_req_cleanup(&open_req1);
|
||||
|
||||
memset(buf, 0, sizeof(buf));
|
||||
r = uv_fs_read(loop, &read_req, open_req1.result, buf, sizeof(buf), -1,
|
||||
NULL);
|
||||
ASSERT(r != -1);
|
||||
ASSERT(read_req.result != -1);
|
||||
ASSERT(strcmp(buf, test_buf) == 0);
|
||||
uv_fs_req_cleanup(&read_req);
|
||||
|
||||
r = uv_fs_read(loop, &read_req, open_req1.result, buf, sizeof(buf),
|
||||
read_req.result, NULL);
|
||||
ASSERT(r == 0);
|
||||
ASSERT(read_req.result == 0);
|
||||
uv_fs_req_cleanup(&read_req);
|
||||
|
||||
r = uv_fs_close(loop, &close_req, open_req1.result, NULL);
|
||||
ASSERT(r != -1);
|
||||
ASSERT(close_req.result != -1);
|
||||
uv_fs_req_cleanup(&close_req);
|
||||
|
||||
/* Cleanup */
|
||||
unlink("test_file");
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -134,7 +134,7 @@
|
||||
<br>
|
||||
<a href="http://nodejs.ir">nodejs.ir</a> Iran group in Persian
|
||||
<br>
|
||||
<a href="http://nodejs.jp/">nodejs.jp</a> Japan user group
|
||||
<a href="http://nodejs.jp/">nodejs.jp</a> Japan user group
|
||||
<br>
|
||||
<a href="http://cnodejs.org">CNodeJS.org</a> Chinese community
|
||||
<br>
|
||||
@ -142,7 +142,13 @@
|
||||
<br>
|
||||
<a href="http://nodejs.hk">HKNoJ</a> Hong Kong community
|
||||
<br>
|
||||
<a href="http://nodejs.tw">nodejs.tw</a> Taiwan community</p>
|
||||
<a href="http://nodejs.tw">nodejs.tw</a> Taiwan community
|
||||
<br>
|
||||
<a href="http://nodehispano.com">Node Hispano</a> Spanish language community
|
||||
<br>
|
||||
<a href="http://nodejskr.org">OctoberSkyJs</a> Korea Node.js community
|
||||
</p>
|
||||
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
Binary file not shown.
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.4 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.6 KiB |
Binary file not shown.
Before Width: | Height: | Size: 2.5 KiB After Width: | Height: | Size: 1.6 KiB |
11
doc/pipe.css
11
doc/pipe.css
@ -150,16 +150,7 @@ h1 a, h2 a, h3 a, h4 a
|
||||
font-size: 11px;
|
||||
}
|
||||
|
||||
#quotes ul li.ebay {
|
||||
margin-top: -10px;
|
||||
}
|
||||
|
||||
#quotes ul li.linkedin {
|
||||
margin-top: -4px;
|
||||
}
|
||||
|
||||
#quotes ul li.yahoo {
|
||||
margin-top: -4px;
|
||||
#quotes ul li:last-child {
|
||||
padding-right: 0;
|
||||
}
|
||||
|
||||
|
12
lib/fs.js
12
lib/fs.js
@ -106,6 +106,7 @@ fs.readFile = function(path, encoding_) {
|
||||
var readStream = fs.createReadStream(path);
|
||||
var buffers = [];
|
||||
var nread = 0;
|
||||
var error;
|
||||
|
||||
readStream.on('data', function(chunk) {
|
||||
buffers.push(chunk);
|
||||
@ -113,11 +114,18 @@ fs.readFile = function(path, encoding_) {
|
||||
});
|
||||
|
||||
readStream.on('error', function(er) {
|
||||
callback(er);
|
||||
error = er;
|
||||
readStream.destroy();
|
||||
if (!readStream.fd) {
|
||||
readStream.emit('close');
|
||||
}
|
||||
});
|
||||
|
||||
readStream.on('end', function() {
|
||||
readStream.on('close', function() {
|
||||
if (error) {
|
||||
return callback(error);
|
||||
}
|
||||
|
||||
// copy all the buffers into one
|
||||
var buffer;
|
||||
switch (buffers.length) {
|
||||
|
62
lib/net.js
62
lib/net.js
@ -114,6 +114,7 @@ function initSocketHandle(self) {
|
||||
self._flags = 0;
|
||||
self._connectQueueSize = 0;
|
||||
self.destroyed = false;
|
||||
self.errorEmitted = false;
|
||||
self.bytesRead = 0;
|
||||
self.bytesWritten = 0;
|
||||
|
||||
@ -278,7 +279,7 @@ Socket.prototype.end = function(data, encoding) {
|
||||
var shutdownReq = this._handle.shutdown();
|
||||
|
||||
if (!shutdownReq) {
|
||||
this.destroy(errnoException(errno, 'shutdown'));
|
||||
this._destroy(errnoException(errno, 'shutdown'));
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -301,7 +302,7 @@ function afterShutdown(status, handle, req) {
|
||||
}
|
||||
|
||||
if (self._flags & FLAG_GOT_EOF || !self.readable) {
|
||||
self.destroy();
|
||||
self._destroy();
|
||||
} else {
|
||||
}
|
||||
}
|
||||
@ -312,7 +313,7 @@ Socket.prototype.destroySoon = function() {
|
||||
this._flags |= FLAG_DESTROY_SOON;
|
||||
|
||||
if (this._pendingWriteReqs == 0) {
|
||||
this.destroy();
|
||||
this._destroy();
|
||||
}
|
||||
};
|
||||
|
||||
@ -324,11 +325,24 @@ Socket.prototype._connectQueueCleanUp = function(exception) {
|
||||
};
|
||||
|
||||
|
||||
Socket.prototype.destroy = function(exception) {
|
||||
if (this.destroyed) return;
|
||||
|
||||
Socket.prototype._destroy = function(exception, cb) {
|
||||
var self = this;
|
||||
|
||||
function fireErrorCallbacks() {
|
||||
if (cb) cb(exception);
|
||||
if (exception && !self.errorEmitted) {
|
||||
process.nextTick(function() {
|
||||
self.emit('error', exception);
|
||||
});
|
||||
self.errorEmitted = true;
|
||||
}
|
||||
};
|
||||
|
||||
if (this.destroyed) {
|
||||
fireErrorCallbacks();
|
||||
return;
|
||||
}
|
||||
|
||||
self._connectQueueCleanUp();
|
||||
|
||||
debug('destroy');
|
||||
@ -349,8 +363,9 @@ Socket.prototype.destroy = function(exception) {
|
||||
this._handle = null;
|
||||
}
|
||||
|
||||
fireErrorCallbacks();
|
||||
|
||||
process.nextTick(function() {
|
||||
if (exception) self.emit('error', exception);
|
||||
self.emit('close', exception ? true : false);
|
||||
});
|
||||
|
||||
@ -358,6 +373,11 @@ Socket.prototype.destroy = function(exception) {
|
||||
};
|
||||
|
||||
|
||||
Socket.prototype.destroy = function(exception) {
|
||||
this._destroy(exception);
|
||||
}
|
||||
|
||||
|
||||
function onread(buffer, offset, length) {
|
||||
var handle = this;
|
||||
var self = handle.socket;
|
||||
@ -396,7 +416,7 @@ function onread(buffer, offset, length) {
|
||||
|
||||
// We call destroy() before end(). 'close' not emitted until nextTick so
|
||||
// the 'end' event will come first as required.
|
||||
if (!self.writable) self.destroy();
|
||||
if (!self.writable) self._destroy();
|
||||
|
||||
if (!self.allowHalfOpen) self.end();
|
||||
if (self._events && self._events['end']) self.emit('end');
|
||||
@ -404,9 +424,9 @@ function onread(buffer, offset, length) {
|
||||
} else {
|
||||
// Error
|
||||
if (errno == 'ECONNRESET') {
|
||||
self.destroy();
|
||||
self._destroy();
|
||||
} else {
|
||||
self.destroy(errnoException(errno, 'read'));
|
||||
self._destroy(errnoException(errno, 'read'));
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -484,13 +504,16 @@ Socket.prototype.write = function(data, arg1, arg2) {
|
||||
Socket.prototype._write = function(data, encoding, cb) {
|
||||
timers.active(this);
|
||||
|
||||
if (!this._handle) throw new Error('This socket is closed.');
|
||||
if (!this._handle) {
|
||||
this._destroy(new Error('This socket is closed.'), cb);
|
||||
return false;
|
||||
}
|
||||
|
||||
// `encoding` is unused right now, `data` is always a buffer.
|
||||
var writeReq = this._handle.write(data);
|
||||
|
||||
if (!writeReq) {
|
||||
this.destroy(errnoException(errno, 'write'));
|
||||
this._destroy(errnoException(errno, 'write'), cb);
|
||||
return false;
|
||||
}
|
||||
|
||||
@ -511,7 +534,7 @@ function afterWrite(status, handle, req, buffer) {
|
||||
}
|
||||
|
||||
if (status) {
|
||||
self.destroy(errnoException(errno, 'write'));
|
||||
self._destroy(errnoException(errno, 'write'), req.cb);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -526,7 +549,7 @@ function afterWrite(status, handle, req, buffer) {
|
||||
if (req.cb) req.cb();
|
||||
|
||||
if (self._pendingWriteReqs == 0 && self._flags & FLAG_DESTROY_SOON) {
|
||||
self.destroy();
|
||||
self._destroy();
|
||||
}
|
||||
}
|
||||
|
||||
@ -563,7 +586,7 @@ function connect(self, address, port, addressType, localAddress) {
|
||||
if (connectReq !== null) {
|
||||
connectReq.oncomplete = afterConnect;
|
||||
} else {
|
||||
self.destroy(errnoException(errno, 'connect'));
|
||||
self._destroy(errnoException(errno, 'connect'));
|
||||
}
|
||||
}
|
||||
|
||||
@ -617,7 +640,7 @@ Socket.prototype.connect = function(options, cb) {
|
||||
// error event to the next tick.
|
||||
process.nextTick(function() {
|
||||
self.emit('error', err);
|
||||
self.destroy();
|
||||
self._destroy();
|
||||
});
|
||||
} else {
|
||||
timers.active(self);
|
||||
@ -662,8 +685,9 @@ function afterConnect(status, handle, req, readable, writable) {
|
||||
|
||||
if (self._connectQueue) {
|
||||
debug('Drain the connect queue');
|
||||
for (var i = 0; i < self._connectQueue.length; i++) {
|
||||
self._write.apply(self, self._connectQueue[i]);
|
||||
var connectQueue = self._connectQueue;
|
||||
for (var i = 0; i < connectQueue.length; i++) {
|
||||
self._write.apply(self, connectQueue[i]);
|
||||
}
|
||||
self._connectQueueCleanUp();
|
||||
}
|
||||
@ -677,7 +701,7 @@ function afterConnect(status, handle, req, readable, writable) {
|
||||
}
|
||||
} else {
|
||||
self._connectQueueCleanUp();
|
||||
self.destroy(errnoException(errno, 'connect'));
|
||||
self._destroy(errnoException(errno, 'connect'));
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -75,6 +75,14 @@
|
||||
#define NODE_STRINGIFY_HELPER(n) #n
|
||||
#endif
|
||||
|
||||
#ifndef STATIC_ASSERT
|
||||
#if defined(_MSC_VER)
|
||||
# define STATIC_ASSERT(expr) static_assert(expr, "")
|
||||
# else
|
||||
# define STATIC_ASSERT(expr) static_cast<void>((sizeof(char[-1 + !!(expr)])))
|
||||
# endif
|
||||
#endif
|
||||
|
||||
namespace node {
|
||||
|
||||
int Start(int argc, char *argv[]);
|
||||
|
@ -972,7 +972,10 @@ Handle<Value> Connection::New(const Arguments& args) {
|
||||
}
|
||||
|
||||
|
||||
void Connection::SSLInfoCallback(const SSL *ssl, int where, int ret) {
|
||||
void Connection::SSLInfoCallback(const SSL *ssl_, int where, int ret) {
|
||||
// Be compatible with older versions of OpenSSL. SSL_get_app_data() wants
|
||||
// a non-const SSL* in OpenSSL <= 0.9.7e.
|
||||
SSL* ssl = const_cast<SSL*>(ssl_);
|
||||
if (where & SSL_CB_HANDSHAKE_START) {
|
||||
HandleScope scope;
|
||||
Connection* c = static_cast<Connection*>(SSL_get_app_data(ssl));
|
||||
|
@ -39,7 +39,6 @@
|
||||
# include <io.h>
|
||||
#endif
|
||||
|
||||
|
||||
namespace node {
|
||||
|
||||
using namespace v8;
|
||||
@ -70,10 +69,41 @@ static Persistent<String> buf_symbol;
|
||||
static Persistent<String> oncomplete_sym;
|
||||
|
||||
|
||||
#ifdef _LARGEFILE_SOURCE
|
||||
static inline int IsInt64(double x) {
|
||||
return x == static_cast<double>(static_cast<int64_t>(x));
|
||||
}
|
||||
#ifndef _LARGEFILE_SOURCE
|
||||
typedef off_t node_off_t;
|
||||
# define ASSERT_OFFSET(a) \
|
||||
STATIC_ASSERT(sizeof(node_off_t) * CHAR_BIT >= 32); \
|
||||
if (!(a)->IsUndefined() && !(a)->IsNull() && !(a)->IsInt32()) { \
|
||||
return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
|
||||
}
|
||||
# define ASSERT_TRUNCATE_LENGTH(a) \
|
||||
if (!(a)->IsUndefined() && !(a)->IsNull() && !(a)->IsUint32()) { \
|
||||
return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
|
||||
}
|
||||
# define GET_OFFSET(a) ((a)->IsNumber() ? (a)->Int32Value() : -1)
|
||||
# define GET_TRUNCATE_LENGTH(a) ((a)->Uint32Value())
|
||||
#else
|
||||
# ifdef _WIN32
|
||||
# define NODE_USE_64BIT_UV_FS_API
|
||||
typedef int64_t node_off_t;
|
||||
# else
|
||||
typedef off_t node_off_t;
|
||||
# endif
|
||||
# define ASSERT_OFFSET(a) \
|
||||
STATIC_ASSERT(sizeof(node_off_t) * CHAR_BIT >= 64); \
|
||||
if (!(a)->IsUndefined() && !(a)->IsNull() && !IsInt64((a)->NumberValue())) { \
|
||||
return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
|
||||
}
|
||||
# define ASSERT_TRUNCATE_LENGTH(a) \
|
||||
if (!(a)->IsUndefined() && !(a)->IsNull() && !IsInt64((a)->NumberValue())) { \
|
||||
return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
|
||||
}
|
||||
# define GET_OFFSET(a) ((a)->IsNumber() ? (a)->IntegerValue() : -1)
|
||||
# define GET_TRUNCATE_LENGTH(a) ((a)->IntegerValue())
|
||||
|
||||
static inline int IsInt64(double x) {
|
||||
return x == static_cast<double>(static_cast<int64_t>(x));
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
@ -475,20 +505,6 @@ static Handle<Value> Rename(const Arguments& args) {
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef _LARGEFILE_SOURCE
|
||||
#define ASSERT_TRUNCATE_LENGTH(a) \
|
||||
if (!(a)->IsUndefined() && !(a)->IsNull() && !(a)->IsUint32()) { \
|
||||
return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
|
||||
}
|
||||
#define GET_TRUNCATE_LENGTH(a) ((a)->Uint32Value())
|
||||
#else
|
||||
#define ASSERT_TRUNCATE_LENGTH(a) \
|
||||
if (!(a)->IsUndefined() && !(a)->IsNull() && !IsInt64((a)->NumberValue())) { \
|
||||
return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
|
||||
}
|
||||
#define GET_TRUNCATE_LENGTH(a) ((a)->IntegerValue())
|
||||
#endif
|
||||
|
||||
static Handle<Value> Truncate(const Arguments& args) {
|
||||
HandleScope scope;
|
||||
|
||||
@ -499,12 +515,20 @@ static Handle<Value> Truncate(const Arguments& args) {
|
||||
int fd = args[0]->Int32Value();
|
||||
|
||||
ASSERT_TRUNCATE_LENGTH(args[1]);
|
||||
off_t len = GET_TRUNCATE_LENGTH(args[1]);
|
||||
node_off_t len = GET_TRUNCATE_LENGTH(args[1]);
|
||||
|
||||
if (args[2]->IsFunction()) {
|
||||
#ifdef NODE_USE_64BIT_UV_FS_API
|
||||
ASYNC_CALL(ftruncate64, args[2], fd, len)
|
||||
#else
|
||||
ASYNC_CALL(ftruncate, args[2], fd, len)
|
||||
#endif
|
||||
} else {
|
||||
#ifdef NODE_USE_64BIT_UV_FS_API
|
||||
SYNC_CALL(ftruncate64, 0, fd, len)
|
||||
#else
|
||||
SYNC_CALL(ftruncate, 0, fd, len)
|
||||
#endif
|
||||
return Undefined();
|
||||
}
|
||||
}
|
||||
@ -674,20 +698,6 @@ static Handle<Value> Open(const Arguments& args) {
|
||||
}
|
||||
}
|
||||
|
||||
#ifndef _LARGEFILE_SOURCE
|
||||
#define ASSERT_OFFSET(a) \
|
||||
if (!(a)->IsUndefined() && !(a)->IsNull() && !(a)->IsInt32()) { \
|
||||
return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
|
||||
}
|
||||
#define GET_OFFSET(a) ((a)->IsNumber() ? (a)->Int32Value() : -1)
|
||||
#else
|
||||
#define ASSERT_OFFSET(a) \
|
||||
if (!(a)->IsUndefined() && !(a)->IsNull() && !IsInt64((a)->NumberValue())) { \
|
||||
return ThrowException(Exception::TypeError(String::New("Not an integer"))); \
|
||||
}
|
||||
#define GET_OFFSET(a) ((a)->IsNumber() ? (a)->IntegerValue() : -1)
|
||||
#endif
|
||||
|
||||
// bytesWritten = write(fd, data, position, enc, callback)
|
||||
// Wrapper for write(2).
|
||||
//
|
||||
@ -728,15 +738,23 @@ static Handle<Value> Write(const Arguments& args) {
|
||||
}
|
||||
|
||||
ASSERT_OFFSET(args[4]);
|
||||
off_t pos = GET_OFFSET(args[4]);
|
||||
node_off_t pos = GET_OFFSET(args[4]);
|
||||
|
||||
char * buf = (char*)buffer_data + off;
|
||||
Local<Value> cb = args[5];
|
||||
|
||||
if (cb->IsFunction()) {
|
||||
#ifdef NODE_USE_64BIT_UV_FS_API
|
||||
ASYNC_CALL(write64, cb, fd, buf, len, pos)
|
||||
#else
|
||||
ASYNC_CALL(write, cb, fd, buf, len, pos)
|
||||
#endif
|
||||
} else {
|
||||
#ifdef NODE_USE_64BIT_UV_FS_API
|
||||
SYNC_CALL(write64, 0, fd, buf, len, pos)
|
||||
#else
|
||||
SYNC_CALL(write, 0, fd, buf, len, pos)
|
||||
#endif
|
||||
return scope.Close(Integer::New(SYNC_RESULT));
|
||||
}
|
||||
}
|
||||
@ -765,7 +783,7 @@ static Handle<Value> Read(const Arguments& args) {
|
||||
Local<Value> cb;
|
||||
|
||||
size_t len;
|
||||
off_t pos;
|
||||
node_off_t pos;
|
||||
|
||||
char * buf = NULL;
|
||||
|
||||
@ -797,9 +815,17 @@ static Handle<Value> Read(const Arguments& args) {
|
||||
cb = args[5];
|
||||
|
||||
if (cb->IsFunction()) {
|
||||
#ifdef NODE_USE_64BIT_UV_FS_API
|
||||
ASYNC_CALL(read64, cb, fd, buf, len, pos);
|
||||
#else
|
||||
ASYNC_CALL(read, cb, fd, buf, len, pos);
|
||||
#endif
|
||||
} else {
|
||||
#ifdef NODE_USE_64BIT_UV_FS_API
|
||||
SYNC_CALL(read64, 0, fd, buf, len, pos)
|
||||
#else
|
||||
SYNC_CALL(read, 0, fd, buf, len, pos)
|
||||
#endif
|
||||
Local<Integer> bytesRead = Integer::New(SYNC_RESULT);
|
||||
return scope.Close(bytesRead);
|
||||
}
|
||||
|
@ -471,6 +471,8 @@ class TypedArray {
|
||||
case v8::kExternalPixelArray: return "Uint8ClampedArray";
|
||||
}
|
||||
abort();
|
||||
// Please the compiler
|
||||
return "";
|
||||
}
|
||||
};
|
||||
|
||||
@ -567,7 +569,7 @@ int valueToCType(v8::Handle<v8::Value> value) {
|
||||
|
||||
template <>
|
||||
float valueToCType(v8::Handle<v8::Value> value) {
|
||||
return value->NumberValue();
|
||||
return static_cast<float>(value->NumberValue());
|
||||
}
|
||||
|
||||
template <>
|
||||
|
@ -53,6 +53,6 @@ assert.ok(exceptionRaised);
|
||||
fs.close(fd);
|
||||
|
||||
process.on('exit', function() {
|
||||
fs.unlink(filepath);
|
||||
fs.unlinkSync(filepath);
|
||||
});
|
||||
|
48
test/simple/test-fs-readfile-unlink.js
Normal file
48
test/simple/test-fs-readfile-unlink.js
Normal file
@ -0,0 +1,48 @@
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
// persons to whom the Software is furnished to do so, subject to the
|
||||
// following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
var assert = require('assert'),
|
||||
common = require('../common'),
|
||||
fs = require('fs'),
|
||||
path = require('path'),
|
||||
dirName = path.resolve(common.fixturesDir, 'test-readfile-unlink'),
|
||||
fileName = path.resolve(dirName, 'test.bin');
|
||||
|
||||
var buf = new Buffer(512 * 1024);
|
||||
buf.fill(42);
|
||||
|
||||
try {
|
||||
fs.mkdirSync(dirName);
|
||||
} catch (e) {
|
||||
// Ignore if the directory already exists.
|
||||
if (e.code != 'EEXIST') throw e;
|
||||
}
|
||||
|
||||
fs.writeFileSync(fileName, buf);
|
||||
|
||||
fs.readFile(fileName, function(err, data) {
|
||||
assert.ifError(err);
|
||||
assert(data.length == buf.length);
|
||||
assert.strictEqual(buf[0], 42);
|
||||
|
||||
fs.unlinkSync(fileName);
|
||||
fs.rmdirSync(dirName);
|
||||
});
|
46
test/simple/test-http-no-content-length.js
Normal file
46
test/simple/test-http-no-content-length.js
Normal file
@ -0,0 +1,46 @@
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
// persons to whom the Software is furnished to do so, subject to the
|
||||
// following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
var common = require('../common');
|
||||
var assert = require('assert');
|
||||
var net = require('net');
|
||||
var http = require('http');
|
||||
|
||||
var body = '';
|
||||
|
||||
var server = net.createServer(function(socket) {
|
||||
// Neither Content-Length nor Connection
|
||||
socket.end('HTTP/1.1 200 ok\r\n\r\nHello');
|
||||
}).listen(common.PORT, function() {
|
||||
var req = http.get({port: common.PORT}, function(res) {
|
||||
res.setEncoding('utf8');
|
||||
res.on('data', function(chunk) {
|
||||
body += chunk;
|
||||
});
|
||||
res.on('end', function() {
|
||||
server.close();
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
process.on('exit', function() {
|
||||
assert.equal(body, 'Hello');
|
||||
});
|
37
test/simple/test-memory-usage-emfile.js
Normal file
37
test/simple/test-memory-usage-emfile.js
Normal file
@ -0,0 +1,37 @@
|
||||
// Copyright Joyent, Inc. and other Node contributors.
|
||||
//
|
||||
// Permission is hereby granted, free of charge, to any person obtaining a
|
||||
// copy of this software and associated documentation files (the
|
||||
// "Software"), to deal in the Software without restriction, including
|
||||
// without limitation the rights to use, copy, modify, merge, publish,
|
||||
// distribute, sublicense, and/or sell copies of the Software, and to permit
|
||||
// persons to whom the Software is furnished to do so, subject to the
|
||||
// following conditions:
|
||||
//
|
||||
// The above copyright notice and this permission notice shall be included
|
||||
// in all copies or substantial portions of the Software.
|
||||
//
|
||||
// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
|
||||
// OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||
// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN
|
||||
// NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
|
||||
// DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
|
||||
// OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
|
||||
// USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||
|
||||
|
||||
|
||||
|
||||
var common = require('../common');
|
||||
var assert = require('assert');
|
||||
|
||||
var fs = require('fs');
|
||||
|
||||
var files = [];
|
||||
|
||||
while (files.length < 256)
|
||||
files.push(fs.openSync(__filename, 'r'));
|
||||
|
||||
var r = process.memoryUsage();
|
||||
console.log(common.inspect(r));
|
||||
assert.equal(true, r['rss'] > 0);
|
@ -24,18 +24,23 @@ var assert = require('assert');
|
||||
var net = require('net');
|
||||
|
||||
var gotError = false;
|
||||
var gotWriteCB = false;
|
||||
|
||||
process.on('exit', function() {
|
||||
assert(gotError);
|
||||
assert(gotWriteCB);
|
||||
});
|
||||
|
||||
var server = net.createServer(function(socket) {
|
||||
setTimeout(function() {
|
||||
assert.throws(function() {
|
||||
socket.write('test');
|
||||
}, /This socket is closed/);
|
||||
socket.on('error', function(error) {
|
||||
server.close();
|
||||
gotError = true;
|
||||
});
|
||||
|
||||
setTimeout(function() {
|
||||
socket.write('test', function(e) {
|
||||
gotWriteCB = true;
|
||||
});
|
||||
}, 250);
|
||||
});
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user