merge revision(s) 18262:

* win32/win32.c (rb_w32_select): recalc the rest of timeout for each
	  iterations.  [ruby-core:18015]


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_8_7@21290 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shyouhei 2009-01-03 19:46:23 +00:00
parent 202ac43838
commit c98501e706
4 changed files with 50 additions and 13 deletions

View file

@ -1,3 +1,8 @@
Sun Jan 4 04:45:26 2009 Nobuyoshi Nakada <nobu@ruby-lang.org>
* win32/win32.c (rb_w32_select): recalc the rest of timeout for each
iterations. [ruby-core:18015]
Fri Jan 2 03:08:47 2009 Kouhei Sutou <kou@cozmixng.org> Fri Jan 2 03:08:47 2009 Kouhei Sutou <kou@cozmixng.org>
* test/rss/: use PNG instead of zlib as binary data. [ruby-dev:35666] * test/rss/: use PNG instead of zlib as binary data. [ruby-dev:35666]

10
test/ruby/test_sleep.rb Normal file
View file

@ -0,0 +1,10 @@
require 'test/unit'
class TestSleep < Test::Unit::TestCase
def test_sleep_5sec
start = Time.now
sleep 5
slept = Time.now-start
assert_in_delta(5.0, slept, 0.1, "[ruby-core:18015]: longer than expected")
end
end

View file

@ -1,15 +1,15 @@
#define RUBY_VERSION "1.8.7" #define RUBY_VERSION "1.8.7"
#define RUBY_RELEASE_DATE "2009-01-02" #define RUBY_RELEASE_DATE "2009-01-04"
#define RUBY_VERSION_CODE 187 #define RUBY_VERSION_CODE 187
#define RUBY_RELEASE_CODE 20090102 #define RUBY_RELEASE_CODE 20090104
#define RUBY_PATCHLEVEL 74 #define RUBY_PATCHLEVEL 75
#define RUBY_VERSION_MAJOR 1 #define RUBY_VERSION_MAJOR 1
#define RUBY_VERSION_MINOR 8 #define RUBY_VERSION_MINOR 8
#define RUBY_VERSION_TEENY 7 #define RUBY_VERSION_TEENY 7
#define RUBY_RELEASE_YEAR 2009 #define RUBY_RELEASE_YEAR 2009
#define RUBY_RELEASE_MONTH 1 #define RUBY_RELEASE_MONTH 1
#define RUBY_RELEASE_DAY 2 #define RUBY_RELEASE_DAY 4
#ifdef RUBY_EXTERN #ifdef RUBY_EXTERN
RUBY_EXTERN const char ruby_version[]; RUBY_EXTERN const char ruby_version[];

View file

@ -2177,7 +2177,7 @@ do_select(int nfds, fd_set *rd, fd_set *wr, fd_set *ex,
} }
static inline int static inline int
subst(struct timeval *rest, const struct timeval *wait) subtract(struct timeval *rest, const struct timeval *wait)
{ {
while (rest->tv_usec < wait->tv_usec) { while (rest->tv_usec < wait->tv_usec) {
if (rest->tv_sec <= wait->tv_sec) { if (rest->tv_sec <= wait->tv_sec) {
@ -2207,8 +2207,8 @@ compare(const struct timeval *t1, const struct timeval *t2)
#undef Sleep #undef Sleep
long long
rb_w32_select (int nfds, fd_set *rd, fd_set *wr, fd_set *ex, rb_w32_select(int nfds, fd_set *rd, fd_set *wr, fd_set *ex,
struct timeval *timeout) struct timeval *timeout)
{ {
long r; long r;
fd_set pipe_rd; fd_set pipe_rd;
@ -2216,11 +2216,29 @@ rb_w32_select (int nfds, fd_set *rd, fd_set *wr, fd_set *ex,
fd_set else_rd; fd_set else_rd;
fd_set else_wr; fd_set else_wr;
int nonsock = 0; int nonsock = 0;
struct timeval limit;
if (nfds < 0 || (timeout && (timeout->tv_sec < 0 || timeout->tv_usec < 0))) { if (nfds < 0 || (timeout && (timeout->tv_sec < 0 || timeout->tv_usec < 0))) {
errno = EINVAL; errno = EINVAL;
return -1; return -1;
} }
if (timeout) {
if (timeout->tv_sec < 0 ||
timeout->tv_usec < 0 ||
timeout->tv_usec >= 1000000) {
errno = EINVAL;
return -1;
}
gettimeofday(&limit, NULL);
limit.tv_sec += timeout->tv_sec;
limit.tv_usec += timeout->tv_usec;
if (limit.tv_usec >= 1000000) {
limit.tv_usec -= 1000000;
limit.tv_sec++;
}
}
if (!NtSocketsInitialized) { if (!NtSocketsInitialized) {
StartSockets(); StartSockets();
} }
@ -2253,10 +2271,9 @@ rb_w32_select (int nfds, fd_set *rd, fd_set *wr, fd_set *ex,
struct timeval rest; struct timeval rest;
struct timeval wait; struct timeval wait;
struct timeval zero; struct timeval zero;
if (timeout) rest = *timeout;
wait.tv_sec = 0; wait.tv_usec = 10 * 1000; // 10ms wait.tv_sec = 0; wait.tv_usec = 10 * 1000; // 10ms
zero.tv_sec = 0; zero.tv_usec = 0; // 0ms zero.tv_sec = 0; zero.tv_usec = 0; // 0ms
do { for (;;) {
if (nonsock) { if (nonsock) {
// modifying {else,pipe,cons}_rd is safe because // modifying {else,pipe,cons}_rd is safe because
// if they are modified, function returns immediately. // if they are modified, function returns immediately.
@ -2272,8 +2289,7 @@ rb_w32_select (int nfds, fd_set *rd, fd_set *wr, fd_set *ex,
break; break;
} }
else { else {
struct timeval *dowait = struct timeval *dowait = &wait;
compare(&rest, &wait) < 0 ? &rest : &wait;
fd_set orig_rd; fd_set orig_rd;
fd_set orig_wr; fd_set orig_wr;
@ -2287,10 +2303,16 @@ rb_w32_select (int nfds, fd_set *rd, fd_set *wr, fd_set *ex,
if (wr) *wr = orig_wr; if (wr) *wr = orig_wr;
if (ex) *ex = orig_ex; if (ex) *ex = orig_ex;
// XXX: should check the time select spent if (timeout) {
struct timeval now;
gettimeofday(&now, NULL);
rest = limit;
if (!subtract(&rest, &now)) break;
if (compare(&rest, &wait) < 0) dowait = &rest;
}
Sleep(dowait->tv_sec * 1000 + dowait->tv_usec / 1000); Sleep(dowait->tv_sec * 1000 + dowait->tv_usec / 1000);
} }
} while (!timeout || subst(&rest, &wait)); }
} }
return r; return r;