From: kasperl@chromium.org Date: Wed, 14 Apr 2010 07:36:49 +0000 (+0000) Subject: Avoid messing with the stack overflow limits while interrupts X-Git-Tag: upstream/4.7.83~22024 X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=b266a9ecdd2e38f40aa794d2285f27cc55917a97;p=platform%2Fupstream%2Fv8.git Avoid messing with the stack overflow limits while interrupts are postponed. This way, V8 will wait until interrupts are re-enabled before artifically lowering the stack limit thereby forcing the interruption of the JavaScript executing thread. Review URL: http://codereview.chromium.org/1638009 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@4403 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- diff --git a/src/execution.cc b/src/execution.cc index 2068413..e8b0d94 100644 --- a/src/execution.cc +++ b/src/execution.cc @@ -221,8 +221,8 @@ bool StackGuard::IsStackOverflow() { void StackGuard::EnableInterrupts() { ExecutionAccess access; - if (IsSet(access)) { - set_limits(kInterruptLimit, access); + if (has_pending_interrupts(access)) { + set_interrupt_limits(access); } } @@ -249,11 +249,6 @@ void StackGuard::DisableInterrupts() { } -bool StackGuard::IsSet(const ExecutionAccess& lock) { - return thread_local_.interrupt_flags_ != 0; -} - - bool StackGuard::IsInterrupted() { ExecutionAccess access; return thread_local_.interrupt_flags_ & INTERRUPT; @@ -263,7 +258,7 @@ bool StackGuard::IsInterrupted() { void StackGuard::Interrupt() { ExecutionAccess access; thread_local_.interrupt_flags_ |= INTERRUPT; - set_limits(kInterruptLimit, access); + set_interrupt_limits(access); } @@ -276,7 +271,7 @@ bool StackGuard::IsPreempted() { void StackGuard::Preempt() { ExecutionAccess access; thread_local_.interrupt_flags_ |= PREEMPT; - set_limits(kInterruptLimit, access); + set_interrupt_limits(access); } @@ -289,7 +284,7 @@ bool StackGuard::IsTerminateExecution() { void StackGuard::TerminateExecution() { ExecutionAccess access; thread_local_.interrupt_flags_ |= TERMINATE; - set_limits(kInterruptLimit, access); + set_interrupt_limits(access); } @@ -303,7 +298,7 @@ bool StackGuard::IsDebugBreak() { void StackGuard::DebugBreak() { ExecutionAccess access; thread_local_.interrupt_flags_ |= DEBUGBREAK; - set_limits(kInterruptLimit, access); + set_interrupt_limits(access); } @@ -317,7 +312,7 @@ void StackGuard::DebugCommand() { if (FLAG_debugger_auto_break) { ExecutionAccess access; thread_local_.interrupt_flags_ |= DEBUGCOMMAND; - set_limits(kInterruptLimit, access); + set_interrupt_limits(access); } } #endif @@ -325,7 +320,7 @@ void StackGuard::DebugCommand() { void StackGuard::Continue(InterruptFlag after_what) { ExecutionAccess access; thread_local_.interrupt_flags_ &= ~static_cast(after_what); - if (thread_local_.interrupt_flags_ == 0) { + if (!should_postpone_interrupts(access) && !has_pending_interrupts(access)) { reset_limits(access); } } diff --git a/src/execution.h b/src/execution.h index 10683d6..e683e12 100644 --- a/src/execution.h +++ b/src/execution.h @@ -199,12 +199,24 @@ class StackGuard : public AllStatic { private: // You should hold the ExecutionAccess lock when calling this method. - static bool IsSet(const ExecutionAccess& lock); + static bool has_pending_interrupts(const ExecutionAccess& lock) { + // Sanity check: We shouldn't be asking about pending interrupts + // unless we're not postponing them anymore. + ASSERT(!should_postpone_interrupts(lock)); + return thread_local_.interrupt_flags_ != 0; + } + + // You should hold the ExecutionAccess lock when calling this method. + static bool should_postpone_interrupts(const ExecutionAccess& lock) { + return thread_local_.postpone_interrupts_nesting_ > 0; + } // You should hold the ExecutionAccess lock when calling this method. - static void set_limits(uintptr_t value, const ExecutionAccess& lock) { - thread_local_.jslimit_ = value; - thread_local_.climit_ = value; + static void set_interrupt_limits(const ExecutionAccess& lock) { + // Ignore attempts to interrupt when interrupts are postponed. + if (should_postpone_interrupts(lock)) return; + thread_local_.jslimit_ = kInterruptLimit; + thread_local_.climit_ = kInterruptLimit; Heap::SetStackLimits(); }