Browse Source

Upgrade libuv to 5656e3

This modifies the TTYWrap constructor to add another argument specifying if
it's a readable or writable TTY . That is stdin or stdout. If a TTYWrap is
not readable then writes to it are blocking.

This makes process.stdout blocking.
v0.7.4-release
Ryan Dahl 14 years ago
parent
commit
7cf787a2d1
  1. 3
      deps/uv/include/uv-private/uv-unix.h
  2. 13
      deps/uv/include/uv.h
  3. 3
      deps/uv/src/unix/stream.c
  4. 15
      deps/uv/src/unix/tty.c
  5. 2
      deps/uv/src/win/tty.c
  6. 2
      deps/uv/test/test-tty.c
  7. 4
      lib/tty_uv.js
  8. 6
      src/tty_wrap.cc

3
deps/uv/include/uv-private/uv-unix.h

@ -99,7 +99,8 @@ typedef int uv_file;
ngx_queue_t write_completed_queue; \ ngx_queue_t write_completed_queue; \
int delayed_error; \ int delayed_error; \
uv_connection_cb connection_cb; \ uv_connection_cb connection_cb; \
int accepted_fd; int accepted_fd; \
int blocking;
/* UV_TCP */ /* UV_TCP */

13
deps/uv/include/uv.h

@ -626,7 +626,18 @@ struct uv_tty_s {
UV_TTY_PRIVATE_FIELDS UV_TTY_PRIVATE_FIELDS
}; };
int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd); /*
* Initialize a new TTY stream with the given file descriptor. Usually the
* file descriptor will be
* 0 = stdin
* 1 = stdout
* 2 = stderr
* The last argument, readable, specifies if you plan on calling
* uv_read_start with this stream. stdin is readable, stdout is not.
*
* TTY streams which are not readable have blocking writes.
*/
int uv_tty_init(uv_loop_t*, uv_tty_t*, uv_file fd, int readable);
/* /*
* Set mode. 0 for normal, 1 for raw. * Set mode. 0 for normal, 1 for raw.

3
deps/uv/src/unix/stream.c

@ -53,6 +53,7 @@ void uv__stream_init(uv_loop_t* loop,
uv_stream_t* stream, uv_stream_t* stream,
uv_handle_type type) { uv_handle_type type) {
uv__handle_init(loop, (uv_handle_t*)stream, type); uv__handle_init(loop, (uv_handle_t*)stream, type);
loop->counters.stream_init++;
stream->alloc_cb = NULL; stream->alloc_cb = NULL;
stream->close_cb = NULL; stream->close_cb = NULL;
@ -83,7 +84,7 @@ int uv__stream_open(uv_stream_t* stream, int fd, int flags) {
assert(fd >= 0); assert(fd >= 0);
stream->fd = fd; stream->fd = fd;
((uv_handle_t*)stream)->flags |= flags; stream->flags |= flags;
/* Reuse the port address if applicable. */ /* Reuse the port address if applicable. */
yes = 1; yes = 1;

15
deps/uv/src/unix/tty.c

@ -33,10 +33,19 @@ static int orig_termios_fd = -1;
static struct termios orig_termios; static struct termios orig_termios;
int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd) { int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd, int readable) {
uv__nonblock(fd, 1);
uv__stream_init(loop, (uv_stream_t*)tty, UV_TTY); uv__stream_init(loop, (uv_stream_t*)tty, UV_TTY);
uv__stream_open((uv_stream_t*)tty, fd, UV_READABLE | UV_WRITABLE);
if (readable) {
uv__nonblock(fd, 1);
uv__stream_open((uv_stream_t*)tty, fd, UV_READABLE);
} else {
/* Note: writable tty we set to blocking mode. */
uv__nonblock(fd, 0);
uv__stream_open((uv_stream_t*)tty, fd, UV_WRITABLE);
tty->blocking = 1;
}
loop->counters.tty_init++; loop->counters.tty_init++;
tty->mode = 0; tty->mode = 0;
return 0; return 0;

2
deps/uv/src/win/tty.c

@ -86,7 +86,7 @@ void uv_console_init() {
} }
int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, uv_file fd) { int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, uv_file fd, int readable) {
HANDLE win_handle; HANDLE win_handle;
CONSOLE_SCREEN_BUFFER_INFO info; CONSOLE_SCREEN_BUFFER_INFO info;

2
deps/uv/test/test-tty.c

@ -33,7 +33,7 @@ TEST_IMPL(tty) {
*/ */
ASSERT(UV_TTY == uv_guess_handle(0)); ASSERT(UV_TTY == uv_guess_handle(0));
r = uv_tty_init(uv_default_loop(), &tty, 0); r = uv_tty_init(uv_default_loop(), &tty, 0, 1);
ASSERT(r == 0); ASSERT(r == 0);
r = uv_tty_get_winsize(&tty, &width, &height); r = uv_tty_get_winsize(&tty, &width, &height);

4
lib/tty_uv.js

@ -53,7 +53,7 @@ exports.setWindowSize = function() {
function ReadStream(fd) { function ReadStream(fd) {
if (!(this instanceof ReadStream)) return new ReadStream(fd); if (!(this instanceof ReadStream)) return new ReadStream(fd);
net.Socket.call(this, { net.Socket.call(this, {
handle: new TTY(fd) handle: new TTY(fd, true)
}); });
this.writable = false; this.writable = false;
@ -314,7 +314,7 @@ ReadStream.prototype._emitKey = function(s) {
function WriteStream(fd) { function WriteStream(fd) {
if (!(this instanceof WriteStream)) return new WriteStream(fd); if (!(this instanceof WriteStream)) return new WriteStream(fd);
net.Socket.call(this, { net.Socket.call(this, {
handle: new TTY(fd) handle: new TTY(fd, false)
}); });
this.readable = false; this.readable = false;

6
src/tty_wrap.cc

@ -136,16 +136,16 @@ class TTYWrap : StreamWrap {
int fd = args[0]->Int32Value(); int fd = args[0]->Int32Value();
assert(fd >= 0); assert(fd >= 0);
TTYWrap* wrap = new TTYWrap(args.This(), fd); TTYWrap* wrap = new TTYWrap(args.This(), fd, args[1]->IsTrue());
assert(wrap); assert(wrap);
wrap->UpdateWriteQueueSize(); wrap->UpdateWriteQueueSize();
return scope.Close(args.This()); return scope.Close(args.This());
} }
TTYWrap(Handle<Object> object, int fd) TTYWrap(Handle<Object> object, int fd, bool readable)
: StreamWrap(object, (uv_stream_t*)&handle_) { : StreamWrap(object, (uv_stream_t*)&handle_) {
uv_tty_init(uv_default_loop(), &handle_, fd); uv_tty_init(uv_default_loop(), &handle_, fd, readable);
} }
uv_tty_t handle_; uv_tty_t handle_;

Loading…
Cancel
Save