Index: runtime/vm/thread_interrupter.h |
diff --git a/runtime/vm/thread_interrupter.h b/runtime/vm/thread_interrupter.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..3a3168399578523ae07f947c8b28aa2cfee8e35b |
--- /dev/null |
+++ b/runtime/vm/thread_interrupter.h |
@@ -0,0 +1,99 @@ |
+// Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file |
+// for details. All rights reserved. Use of this source code is governed by a |
+// BSD-style license that can be found in the LICENSE file. |
+ |
+#ifndef VM_THREAD_INTERRUPTER_H_ |
+#define VM_THREAD_INTERRUPTER_H_ |
+ |
+#include "vm/allocation.h" |
+#include "vm/signal_handler.h" |
+#include "vm/thread.h" |
+ |
+ |
+namespace dart { |
+ |
+struct InterruptedThreadState { |
+ ThreadId tid; |
+ uintptr_t pc; |
+ uintptr_t sp; |
+ uintptr_t fp; |
+}; |
+ |
+// When a thread is interrupted the thread specific interrupt |
+// callback will be invoked at the interrupt period. Each callback is given an |
+// InterruptedThreadState and the thread specific data pointer. When inside a |
+// thread interrupt callback doing any of the following |
+// is forbidden: |
+// * Accessing TLS. |
+// * Allocating memory. |
+// * Taking a lock. |
+typedef void (*ThreadInterruptCallback)(const InterruptedThreadState& state, |
+ void* data); |
+ |
+class ThreadInterrupter : public AllStatic { |
+ public: |
+ static void InitOnce(); |
+ static void Shutdown(); |
+ |
+ // Delay between interrupts. |
+ static void SetInterruptPeriod(intptr_t period); |
+ |
+ // Register the currently running thread for interrupts. If the current thread |
+ // is already registered, callback and data will be updated. |
+ static void Register(ThreadInterruptCallback callback, void* data); |
+ // Unregister the currently running thread for interrupts. |
+ static void Unregister(); |
+ |
+ // Enable interrupts for this thread. Does not alter callback. |
+ static void Enable(); |
+ // Disable interrupts for this thread. Does not alter callback. |
+ static void Disable(); |
+ |
+ private: |
+ static const intptr_t kMaxThreads = 4096; |
+ static bool initialized_; |
+ static bool shutdown_; |
+ static bool thread_running_; |
+ static ThreadId interrupter_thread_id_; |
+ static Monitor* monitor_; |
+ static intptr_t interrupt_period_; |
+ static ThreadLocalKey thread_state_key_; |
+ // State stored per registered thread. |
+ struct ThreadState { |
+ ThreadId id; |
+ ThreadInterruptCallback callback; |
+ void* data; |
+ }; |
+ |
+ static void UpdateStateObject(ThreadInterruptCallback callback, void* data); |
+ static ThreadState* CurrentThreadState(); |
+ static void SetCurrentThreadState(ThreadState* state); |
+ |
+ // Registered thread table. |
+ static ThreadState** threads_; |
+ static intptr_t threads_capacity_; |
+ static intptr_t threads_size_; |
+ static void _EnsureThreadStateCreated(); |
+ static void _Enable(); |
+ static void _Disable(); |
+ static void ResizeThreads(intptr_t new_capacity); |
+ static void AddThread(ThreadId id); |
+ static intptr_t FindThreadIndex(ThreadId id); |
+ static ThreadState* RemoveThread(intptr_t i); |
+ |
+ friend class ThreadInterrupterAndroid; |
+ friend class ThreadInterrupterMacOS; |
+ friend class ThreadInterrupterLinux; |
+ friend class ThreadInterrupterWin; |
+ |
+ static void InterruptThreads(int64_t current_time); |
+ static void ThreadMain(uword parameters); |
+ |
+ static void InstallSignalHandler(); |
+}; |
+ |
+void ThreadInterruptNoOp(const InterruptedThreadState& state, void* data); |
+ |
+} // namespace dart |
+ |
+#endif // VM_THREAD_INTERRUPTER_H_ |