1
0
Fork 0
mirror of https://github.com/ruby/ruby.git synced 2022-11-09 12:17:21 -05:00

* thread.c (rb_thread_wait_for): wait until timed out only when

sleeping with timeout.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@17984 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
nobu 2008-07-10 03:09:23 +00:00
parent a0e291f697
commit 7ad9faa528
2 changed files with 29 additions and 24 deletions

View file

@ -1,3 +1,8 @@
Thu Jul 10 12:09:21 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* thread.c (rb_thread_wait_for): wait until timed out only when
sleeping with timeout.
Wed Jul 9 22:41:16 2008 Nobuyoshi Nakada <nobu@ruby-lang.org> Wed Jul 9 22:41:16 2008 Nobuyoshi Nakada <nobu@ruby-lang.org>
* thread.c (sleep_timeval): wait until timed out. [ruby-core:17270] * thread.c (sleep_timeval): wait until timed out. [ruby-core:17270]

View file

@ -736,29 +736,7 @@ getclockofday(struct timeval *tp)
static void static void
sleep_timeval(rb_thread_t *th, struct timeval tv) sleep_timeval(rb_thread_t *th, struct timeval tv)
{ {
struct timeval to, tvn; native_sleep(th, &tv, 0);
getclockofday(&to);
to.tv_sec += tv.tv_sec;
if ((to.tv_usec += tv.tv_usec) >= 1000000) {
to.tv_sec++;
to.tv_usec -= 1000000;
}
for (;;) {
native_sleep(th, &tv, 0);
getclockofday(&tvn);
if (to.tv_sec < tvn.tv_sec) break;
if (to.tv_sec == tvn.tv_sec && to.tv_usec <= tvn.tv_usec) break;
thread_debug("sleep_timeval: %ld.%.6ld > %ld.%.6ld\n",
(long)to.tv_sec, to.tv_usec,
(long)tvn.tv_sec, tvn.tv_usec);
tv.tv_sec = to.tv_sec - tvn.tv_sec;
if ((tv.tv_usec = to.tv_usec - tvn.tv_usec) < 0) {
--tv.tv_sec;
tv.tv_usec += 1000000;
}
}
} }
void void
@ -811,7 +789,29 @@ void
rb_thread_wait_for(struct timeval time) rb_thread_wait_for(struct timeval time)
{ {
rb_thread_t *th = GET_THREAD(); rb_thread_t *th = GET_THREAD();
sleep_timeval(th, time); struct timeval to, tvn;
getclockofday(&to);
to.tv_sec += tv.tv_sec;
if ((to.tv_usec += tv.tv_usec) >= 1000000) {
to.tv_sec++;
to.tv_usec -= 1000000;
}
for (;;) {
sleep_timeval(th, time);
getclockofday(&tvn);
if (to.tv_sec < tvn.tv_sec) break;
if (to.tv_sec == tvn.tv_sec && to.tv_usec <= tvn.tv_usec) break;
thread_debug("sleep_timeval: %ld.%.6ld > %ld.%.6ld\n",
(long)to.tv_sec, to.tv_usec,
(long)tvn.tv_sec, tvn.tv_usec);
tv.tv_sec = to.tv_sec - tvn.tv_sec;
if ((tv.tv_usec = to.tv_usec - tvn.tv_usec) < 0) {
--tv.tv_sec;
tv.tv_usec += 1000000;
}
}
} }
void void