summaryrefslogtreecommitdiff
path: root/deps/v8/src/execution/interrupts-scope.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/execution/interrupts-scope.h')
-rw-r--r--deps/v8/src/execution/interrupts-scope.h72
1 files changed, 72 insertions, 0 deletions
diff --git a/deps/v8/src/execution/interrupts-scope.h b/deps/v8/src/execution/interrupts-scope.h
new file mode 100644
index 0000000000..3d74850a84
--- /dev/null
+++ b/deps/v8/src/execution/interrupts-scope.h
@@ -0,0 +1,72 @@
+// 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, int 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_;
+ int intercept_mask_;
+ int 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_