summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-05-10 05:02:44 +0000
committerusa <usa@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2010-05-10 05:02:44 +0000
commitfe0d339c2c83943445b5f8e1136cc91587afa605 (patch)
treecd4ffd57dee503f9130ff28eaf1fed0a03f21f49
parent15381196629e47e747861a5ea81409cefc8d02ae (diff)
* win32/win32.c, include/ruby/win32.h (rb_w32_has_cancel_io): new
function. * io.c (WAIT_FD_IN_WIN32): check only when it's not cancelable. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@27718 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--include/ruby/win32.h1
-rw-r--r--io.c5
-rw-r--r--win32/win32.c6
3 files changed, 10 insertions, 2 deletions
diff --git a/include/ruby/win32.h b/include/ruby/win32.h
index d75c7ea9d3..47a85270a5 100644
--- a/include/ruby/win32.h
+++ b/include/ruby/win32.h
@@ -222,6 +222,7 @@ struct msghdr {
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_is_socket(int);
extern int WSAAPI rb_w32_accept(int, struct sockaddr *, int *);
extern int WSAAPI rb_w32_bind(int, const struct sockaddr *, int);
diff --git a/io.c b/io.c
index b997b89172..b3caf4b1bc 100644
--- a/io.c
+++ b/io.c
@@ -189,9 +189,10 @@ static int max_file_descriptor = NOFILE;
#define READ_CHAR_PENDING(fptr) ((fptr)->cbuf_len)
#if defined(_WIN32)
-#define WAIT_FD_IN_WIN32(fptr) rb_thread_wait_fd((fptr)->fd);
+#define WAIT_FD_IN_WIN32(fptr) \
+ (rb_w32_has_cancel_io() ? 0 : rb_thread_wait_fd((fptr)->fd))
#else
-#define WAIT_FD_IN_WIN32(fptr) ;
+#define WAIT_FD_IN_WIN32(fptr)
#endif
#define READ_CHECK(fptr) do {\
diff --git a/win32/win32.c b/win32/win32.c
index 3b935b1d36..f0e587b865 100644
--- a/win32/win32.c
+++ b/win32/win32.c
@@ -559,6 +559,12 @@ init_env(void)
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)
{