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:
parent
a0e291f697
commit
7ad9faa528
2 changed files with 29 additions and 24 deletions
|
@ -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]
|
||||||
|
|
48
thread.c
48
thread.c
|
@ -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
|
||||||
|
|
Loading…
Reference in a new issue