Navigation Menu

Skip to content
This repository has been archived by the owner on May 4, 2018. It is now read-only.

Commit

Permalink
Prepare for writable TTY to be blocking
Browse files Browse the repository at this point in the history
  • Loading branch information
ry committed Oct 10, 2011
1 parent 41e8574 commit 5656e3c
Show file tree
Hide file tree
Showing 6 changed files with 30 additions and 8 deletions.
3 changes: 2 additions & 1 deletion include/uv-private/uv-unix.h
Expand Up @@ -99,7 +99,8 @@ typedef int uv_file;
ngx_queue_t write_completed_queue; \
int delayed_error; \
uv_connection_cb connection_cb; \
int accepted_fd;
int accepted_fd; \
int blocking;


/* UV_TCP */
Expand Down
13 changes: 12 additions & 1 deletion include/uv.h
Expand Up @@ -626,7 +626,18 @@ struct uv_tty_s {
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.
Expand Down
3 changes: 2 additions & 1 deletion src/unix/stream.c
Expand Up @@ -53,6 +53,7 @@ void uv__stream_init(uv_loop_t* loop,
uv_stream_t* stream,
uv_handle_type type) {
uv__handle_init(loop, (uv_handle_t*)stream, type);
loop->counters.stream_init++;

stream->alloc_cb = NULL;
stream->close_cb = NULL;
Expand Down Expand Up @@ -83,7 +84,7 @@ int uv__stream_open(uv_stream_t* stream, int fd, int flags) {
assert(fd >= 0);
stream->fd = fd;

((uv_handle_t*)stream)->flags |= flags;
stream->flags |= flags;

/* Reuse the port address if applicable. */
yes = 1;
Expand Down
15 changes: 12 additions & 3 deletions src/unix/tty.c
Expand Up @@ -33,10 +33,19 @@ static int orig_termios_fd = -1;
static struct termios orig_termios;


int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd) {
uv__nonblock(fd, 1);
int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd, int readable) {
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++;
tty->mode = 0;
return 0;
Expand Down
2 changes: 1 addition & 1 deletion src/win/tty.c
Expand Up @@ -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;
CONSOLE_SCREEN_BUFFER_INFO info;

Expand Down
2 changes: 1 addition & 1 deletion test/test-tty.c
Expand Up @@ -33,7 +33,7 @@ TEST_IMPL(tty) {
*/
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);

r = uv_tty_get_winsize(&tty, &width, &height);
Expand Down

0 comments on commit 5656e3c

Please sign in to comment.