diff options
author | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-07-04 16:32:21 +0000 |
---|---|---|
committer | mame <mame@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-07-04 16:32:21 +0000 |
commit | fed26e916bdc9f03f1c27b2bbc47fda6b2236c74 (patch) | |
tree | 8680e807901f2fda90f8365238d4426ae4c23b4c /thread_pthread.c | |
parent | d6a5698d8a14efa0479347fee7c7a40f4966b823 (diff) | |
download | ruby-fed26e916bdc9f03f1c27b2bbc47fda6b2236c74.tar.gz |
* thread_pthread.c (native_sleep): cut the waiting time up to
100,000,000 because Solaris cond_timedwait() return EINVAL if an
argument is greater than current_time + 100,000,000. This is
considered as a kind of spurious wakeup. The caller to native_sleep
should care about spurious wakeup.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@32409 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'thread_pthread.c')
-rw-r--r-- | thread_pthread.c | 13 |
1 files changed, 13 insertions, 0 deletions
diff --git a/thread_pthread.c b/thread_pthread.c index 41d6399c3c..9748526140 100644 --- a/thread_pthread.c +++ b/thread_pthread.c @@ -857,6 +857,19 @@ native_sleep(rb_thread_t *th, struct timeval *timeout_tv) timeout_rel.tv_sec = timeout_tv->tv_sec; timeout_rel.tv_nsec = timeout_tv->tv_usec * 1000; + /* Solaris cond_timedwait() return EINVAL if an argument is greater than + * current_time + 100,000,000. So cut up to 100,000,000. This is + * considered as a kind of spurious wakeup. The caller to native_sleep + * should care about spurious wakeup. + * + * See also [Bug #1341] [ruby-core:29702] + * http://download.oracle.com/docs/cd/E19683-01/816-0216/6m6ngupgv/index.html + */ + if (timeout_rel.tv_sec > 100000000) { + timeout_rel.tv_sec = 100000000; + timeout_rel.tv_nsec = 0; + } + timeout = native_cond_timeout(cond, timeout_rel); } |