ruby-changes:20501
From: usa <ko1@a...>
Date: Fri, 15 Jul 2011 14:33:57 +0900 (JST)
Subject: [ruby-changes:20501] usa:r32549 (trunk): * win32/win32.c, include/ruby/win32.h (rb_w32_io_cancelable_p): renamed
usa 2011-07-15 14:33:45 +0900 (Fri, 15 Jul 2011) New Revision: 32549 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32549 Log: * win32/win32.c, include/ruby/win32.h (rb_w32_io_cancelable_p): renamed from rb_w32_has_cancel_io(). now it takes a parameter as fd to check the fd is console or not, because we cannot cancel console input even if we have cancel_io function. * io.c (WAIT_FD_IN_WIN32): call above function instead of the old one, so now we can kill the thread which calls STDIN.gets. the problem was reported by ko1 vir IRC. Modified files: trunk/include/ruby/win32.h trunk/io.c trunk/win32/win32.c Index: include/ruby/win32.h =================================================================== --- include/ruby/win32.h (revision 32548) +++ include/ruby/win32.h (revision 32549) @@ -234,7 +234,7 @@ extern int rb_w32_cmdvector(const char *, char ***); extern rb_pid_t rb_w32_pipe_exec(const char *, const char *, int, int *, int *); extern int flock(int fd, int oper); -extern int rb_w32_has_cancel_io(void); +extern int rb_w32_io_cancelable_p(int); extern int rb_w32_is_socket(int); extern int WSAAPI rb_w32_accept(int, struct sockaddr *, int *); extern int WSAAPI rb_w32_bind(int, const struct sockaddr *, int); Index: io.c =================================================================== --- io.c (revision 32548) +++ io.c (revision 32549) @@ -188,7 +188,7 @@ #if defined(_WIN32) #define WAIT_FD_IN_WIN32(fptr) \ - (rb_w32_has_cancel_io() ? 0 : rb_thread_wait_fd((fptr)->fd)) + (rb_w32_io_cancelable_p((fptr)->fd) ? 0 : rb_thread_wait_fd((fptr)->fd)) #else #define WAIT_FD_IN_WIN32(fptr) #endif Index: win32/win32.c =================================================================== --- win32/win32.c (revision 32548) +++ win32/win32.c (revision 32549) @@ -578,12 +578,6 @@ typedef BOOL (WINAPI *cancel_io_t)(HANDLE); static cancel_io_t cancel_io = NULL; -int -rb_w32_has_cancel_io(void) -{ - return cancel_io != NULL; -} - static void init_func(void) { @@ -2080,6 +2074,12 @@ #define FDEV 0x40 /* file handle refers to device */ #define FTEXT 0x80 /* file handle is in text mode */ +int +rb_w32_io_cancelable_p(int fd) +{ + return cancel_io != NULL && (is_socket(TO_SOCKET(fd)) || !is_console(TO_SOCKET(fd))); +} + static int rb_w32_open_osfhandle(intptr_t osfhandle, int flags) { -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/