summaryrefslogtreecommitdiff
path: root/deps/v8/src/thread-id.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/thread-id.h')
-rw-r--r--deps/v8/src/thread-id.h73
1 files changed, 73 insertions, 0 deletions
diff --git a/deps/v8/src/thread-id.h b/deps/v8/src/thread-id.h
new file mode 100644
index 0000000000..437109b839
--- /dev/null
+++ b/deps/v8/src/thread-id.h
@@ -0,0 +1,73 @@
+// Copyright 2018 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_THREAD_ID_H_
+#define V8_THREAD_ID_H_
+
+#include "src/base/atomicops.h"
+
+namespace v8 {
+namespace internal {
+
+// Platform-independent, reliable thread identifier.
+class ThreadId {
+ public:
+ // Creates an invalid ThreadId.
+ ThreadId() { base::Relaxed_Store(&id_, kInvalidId); }
+
+ ThreadId& operator=(const ThreadId& other) V8_NOEXCEPT {
+ base::Relaxed_Store(&id_, base::Relaxed_Load(&other.id_));
+ return *this;
+ }
+
+ bool operator==(const ThreadId& other) const { return Equals(other); }
+
+ // Returns ThreadId for current thread if it exists or invalid id.
+ static ThreadId TryGetCurrent();
+
+ // Returns ThreadId for current thread.
+ static ThreadId Current() { return ThreadId(GetCurrentThreadId()); }
+
+ // Returns invalid ThreadId (guaranteed not to be equal to any thread).
+ static ThreadId Invalid() { return ThreadId(kInvalidId); }
+
+ // Compares ThreadIds for equality.
+ V8_INLINE bool Equals(const ThreadId& other) const {
+ return base::Relaxed_Load(&id_) == base::Relaxed_Load(&other.id_);
+ }
+
+ // Checks whether this ThreadId refers to any thread.
+ V8_INLINE bool IsValid() const {
+ return base::Relaxed_Load(&id_) != kInvalidId;
+ }
+
+ // Converts ThreadId to an integer representation
+ // (required for public API: V8::V8::GetCurrentThreadId).
+ int ToInteger() const { return static_cast<int>(base::Relaxed_Load(&id_)); }
+
+ // Converts ThreadId to an integer representation
+ // (required for public API: V8::V8::TerminateExecution).
+ static ThreadId FromInteger(int id) { return ThreadId(id); }
+
+ private:
+ static const int kInvalidId = -1;
+
+ explicit ThreadId(int id) { base::Relaxed_Store(&id_, id); }
+
+ static int AllocateThreadId() {
+ int new_id = base::Relaxed_AtomicIncrement(&highest_thread_id_, 1);
+ return new_id;
+ }
+
+ static int GetCurrentThreadId();
+
+ base::Atomic32 id_;
+
+ static base::Atomic32 highest_thread_id_;
+};
+
+} // namespace internal
+} // namespace v8
+
+#endif // V8_THREAD_ID_H_