diff options
author | gVisor bot <gvisor-bot@google.com> | 2019-08-23 01:34:06 +0000 |
---|---|---|
committer | gVisor bot <gvisor-bot@google.com> | 2019-08-23 01:34:06 +0000 |
commit | 8b90ccd7b2ca18488329edee6e37e73f141a28f2 (patch) | |
tree | 1c3da7aa3aaabd35cfa418ee876fd082402bb4e6 /pkg/sentry/kernel/task_block.go | |
parent | 19bb89b9be83cf45ff83a8aa0f5dbf0da30d579c (diff) | |
parent | f225fdbbe77c2017225517adcf67df70fcf8e36e (diff) |
Merge f225fdbb (automated)
Diffstat (limited to 'pkg/sentry/kernel/task_block.go')
-rw-r--r-- | pkg/sentry/kernel/task_block.go | 12 |
1 files changed, 12 insertions, 0 deletions
diff --git a/pkg/sentry/kernel/task_block.go b/pkg/sentry/kernel/task_block.go index 2a2e6f662..dd69939f9 100644 --- a/pkg/sentry/kernel/task_block.go +++ b/pkg/sentry/kernel/task_block.go @@ -15,6 +15,7 @@ package kernel import ( + "runtime" "time" ktime "gvisor.dev/gvisor/pkg/sentry/kernel/time" @@ -121,6 +122,17 @@ func (t *Task) block(C <-chan struct{}, timerChan <-chan struct{}) error { // Deactive our address space, we don't need it. interrupt := t.SleepStart() + // If the request is not completed, but the timer has already expired, + // then ensure that we run through a scheduler cycle. This is because + // we may see applications relying on timer slack to yield the thread. + // For example, they may attempt to sleep for some number of nanoseconds, + // and expect that this will actually yield the CPU and sleep for at + // least microseconds, e.g.: + // https://github.com/LMAX-Exchange/disruptor/commit/6ca210f2bcd23f703c479804d583718e16f43c07 + if len(timerChan) > 0 { + runtime.Gosched() + } + select { case <-C: t.SleepFinish(true) |