blob: 6419ee2d99ffa9e00c55511682df5b3c8c600bae [file] [log] [blame]
// Copyright 2019 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_EXECUTION_INTERRUPTS_SCOPE_H_
#define V8_EXECUTION_INTERRUPTS_SCOPE_H_
#include "src/execution/stack-guard.h"
namespace v8 {
namespace internal {
class Isolate;
// Scope intercepts only interrupt which is part of its interrupt_mask and does
// not affect other interrupts.
class InterruptsScope {
public:
enum Mode { kPostponeInterrupts, kRunInterrupts, kNoop };
V8_EXPORT_PRIVATE InterruptsScope(Isolate* isolate, intptr_t intercept_mask,
Mode mode);
virtual ~InterruptsScope() {
if (mode_ != kNoop) stack_guard_->PopInterruptsScope();
}
// Find the scope that intercepts this interrupt.
// It may be outermost PostponeInterruptsScope or innermost
// SafeForInterruptsScope if any.
// Return whether the interrupt has been intercepted.
bool Intercept(StackGuard::InterruptFlag flag);
private:
StackGuard* stack_guard_;
intptr_t intercept_mask_;
intptr_t intercepted_flags_;
Mode mode_;
InterruptsScope* prev_;
friend class StackGuard;
};
// Support for temporarily postponing interrupts. When the outermost
// postpone scope is left the interrupts will be re-enabled and any
// interrupts that occurred while in the scope will be taken into
// account.
class PostponeInterruptsScope : public InterruptsScope {
public:
PostponeInterruptsScope(Isolate* isolate,
int intercept_mask = StackGuard::ALL_INTERRUPTS)
: InterruptsScope(isolate, intercept_mask,
InterruptsScope::kPostponeInterrupts) {}
~PostponeInterruptsScope() override = default;
};
// Support for overriding PostponeInterruptsScope. Interrupt is not ignored if
// innermost scope is SafeForInterruptsScope ignoring any outer
// PostponeInterruptsScopes.
class SafeForInterruptsScope : public InterruptsScope {
public:
SafeForInterruptsScope(Isolate* isolate,
int intercept_mask = StackGuard::ALL_INTERRUPTS)
: InterruptsScope(isolate, intercept_mask,
InterruptsScope::kRunInterrupts) {}
~SafeForInterruptsScope() override = default;
};
} // namespace internal
} // namespace v8
#endif // V8_EXECUTION_INTERRUPTS_SCOPE_H_