mirror of https://github.com/lukechilds/node.git
10 changed files with 233 additions and 1 deletions
@ -0,0 +1,69 @@ |
|||||
|
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
|
* |
||||
|
* 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. |
||||
|
*/ |
||||
|
|
||||
|
#include "uv.h" |
||||
|
#include "internal.h" |
||||
|
|
||||
|
#include <assert.h> |
||||
|
#include <termios.h> |
||||
|
#include <errno.h> |
||||
|
|
||||
|
|
||||
|
int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, int fd) { |
||||
|
uv__nonblock(fd, 1); |
||||
|
uv__stream_init(loop, (uv_stream_t*)tty, UV_TTY); |
||||
|
uv__stream_open((uv_stream_t*)tty, fd, UV_READABLE | UV_WRITABLE); |
||||
|
loop->counters.tty_init++; |
||||
|
return 0; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int uv_tty_set_mode(uv_tty_t* tty, int mode) { |
||||
|
int fd = tty->fd; |
||||
|
struct termios orig_termios; /* in order to restore at exit */ |
||||
|
struct termios raw; |
||||
|
|
||||
|
if (tcgetattr(fd, &orig_termios) == -1) goto fatal; |
||||
|
|
||||
|
raw = orig_termios; /* modify the original mode */ |
||||
|
/* input modes: no break, no CR to NL, no parity check, no strip char,
|
||||
|
* no start/stop output control. */ |
||||
|
raw.c_iflag &= ~(BRKINT | ICRNL | INPCK | ISTRIP | IXON); |
||||
|
/* output modes */ |
||||
|
raw.c_oflag |= (ONLCR); |
||||
|
/* control modes - set 8 bit chars */ |
||||
|
raw.c_cflag |= (CS8); |
||||
|
/* local modes - echoing off, canonical off, no extended functions,
|
||||
|
* no signal chars (^Z,^C) */ |
||||
|
raw.c_lflag &= ~(ECHO | ICANON | IEXTEN | ISIG); |
||||
|
/* control chars - set return condition: min number of bytes and timer.
|
||||
|
* We want read to return every single byte, without timeout. */ |
||||
|
raw.c_cc[VMIN] = 1; raw.c_cc[VTIME] = 0; /* 1 byte, no timer */ |
||||
|
|
||||
|
/* put terminal in raw mode after flushing */ |
||||
|
if (tcsetattr(fd, TCSAFLUSH, &raw) < 0) goto fatal; |
||||
|
return 0; |
||||
|
|
||||
|
fatal: |
||||
|
uv_err_new(tty->loop, ENOTTY); |
||||
|
return -1; |
||||
|
} |
||||
|
|
@ -0,0 +1,81 @@ |
|||||
|
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
|
* |
||||
|
* 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. |
||||
|
*/ |
||||
|
|
||||
|
#include <assert.h> |
||||
|
|
||||
|
#include "uv.h" |
||||
|
#include "../uv-common.h" |
||||
|
#include "internal.h" |
||||
|
|
||||
|
|
||||
|
#ifdef _MSC_VER /* msvc */ |
||||
|
# define NOINLINE __declspec (noinline) |
||||
|
#else /* gcc */ |
||||
|
# define NOINLINE __attribute__ ((noinline)) |
||||
|
#endif |
||||
|
|
||||
|
|
||||
|
static NOINLINE void uv__once_inner(uv_once_t* guard, |
||||
|
void (*callback)(void)) { |
||||
|
DWORD result; |
||||
|
HANDLE existing_event, created_event; |
||||
|
HANDLE* event_ptr; |
||||
|
|
||||
|
/* Fetch and align event_ptr */ |
||||
|
event_ptr = (HANDLE*) (((uintptr_t) &guard->event + (sizeof(HANDLE) - 1)) & |
||||
|
~(sizeof(HANDLE) - 1)); |
||||
|
|
||||
|
created_event = CreateEvent(NULL, 1, 0, NULL); |
||||
|
if (created_event == 0) { |
||||
|
/* Could fail in a low-memory situation? */ |
||||
|
uv_fatal_error(GetLastError(), "CreateEvent"); |
||||
|
} |
||||
|
|
||||
|
existing_event = InterlockedCompareExchangePointer(event_ptr, |
||||
|
created_event, |
||||
|
NULL); |
||||
|
|
||||
|
if (existing_event == NULL) { |
||||
|
/* We won the race */ |
||||
|
callback(); |
||||
|
|
||||
|
result = SetEvent(created_event); |
||||
|
assert(result); |
||||
|
guard->ran = 1; |
||||
|
|
||||
|
} else { |
||||
|
/* We lost the race. Destroy the event we created and wait for the */ |
||||
|
/* existing one to become signaled. */ |
||||
|
CloseHandle(created_event); |
||||
|
result = WaitForSingleObject(existing_event, INFINITE); |
||||
|
assert(result == WAIT_OBJECT_0); |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
|
||||
|
void uv_once(uv_once_t* guard, void (*callback)(void)) { |
||||
|
/* Fast case - avoid WaitForSingleObject. */ |
||||
|
if (guard->ran) { |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
uv__once_inner(guard, callback); |
||||
|
} |
@ -0,0 +1,37 @@ |
|||||
|
/* Copyright Joyent, Inc. and other Node contributors. All rights reserved.
|
||||
|
* |
||||
|
* 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. |
||||
|
*/ |
||||
|
|
||||
|
#include "uv.h" |
||||
|
#include "internal.h" |
||||
|
|
||||
|
#include <assert.h> |
||||
|
|
||||
|
|
||||
|
int uv_tty_init(uv_loop_t* loop, uv_tty_t* tty, uv_file fd) { |
||||
|
assert(0 && "implement me"); |
||||
|
return -1; |
||||
|
} |
||||
|
|
||||
|
|
||||
|
int uv_tty_set_mode(uv_tty_t* tty, int mode) { |
||||
|
assert(0 && "implement me"); |
||||
|
return -1; |
||||
|
} |
Loading…
Reference in new issue