62f929ff4c
New code should use nullptr instead of NULL. This patch updates existing use of NULL to nullptr where applicable, making the code base more consistent. BUG=v8:6928,v8:6921 Cq-Include-Trybots: master.tryserver.chromium.linux:linux_chromium_rel_ng;master.tryserver.v8:v8_linux_noi18n_rel_ng Change-Id: I4687f5b96fcfd88b41fa970a2b937b4f6538777c Reviewed-on: https://chromium-review.googlesource.com/718338 Commit-Queue: Mathias Bynens <mathias@chromium.org> Reviewed-by: Andreas Haas <ahaas@chromium.org> Reviewed-by: Benedikt Meurer <bmeurer@chromium.org> Reviewed-by: Ulan Degenbaev <ulan@chromium.org> Reviewed-by: Toon Verwaest <verwaest@chromium.org> Reviewed-by: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Yang Guo <yangguo@chromium.org> Cr-Commit-Position: refs/heads/master@{#48557}
121 lines
2.6 KiB
C++
121 lines
2.6 KiB
C++
// Copyright 2012 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_V8THREADS_H_
|
|
#define V8_V8THREADS_H_
|
|
|
|
#include "src/isolate.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
|
|
class RootVisitor;
|
|
class ThreadLocalTop;
|
|
|
|
class ThreadState {
|
|
public:
|
|
// Returns nullptr after the last one.
|
|
ThreadState* Next();
|
|
|
|
enum List {FREE_LIST, IN_USE_LIST};
|
|
|
|
void LinkInto(List list);
|
|
void Unlink();
|
|
|
|
// Id of thread.
|
|
void set_id(ThreadId id) { id_ = id; }
|
|
ThreadId id() { return id_; }
|
|
|
|
// Should the thread be terminated when it is restored?
|
|
bool terminate_on_restore() { return terminate_on_restore_; }
|
|
void set_terminate_on_restore(bool terminate_on_restore) {
|
|
terminate_on_restore_ = terminate_on_restore;
|
|
}
|
|
|
|
// Get data area for archiving a thread.
|
|
char* data() { return data_; }
|
|
|
|
private:
|
|
explicit ThreadState(ThreadManager* thread_manager);
|
|
~ThreadState();
|
|
|
|
void AllocateSpace();
|
|
|
|
ThreadId id_;
|
|
bool terminate_on_restore_;
|
|
char* data_;
|
|
ThreadState* next_;
|
|
ThreadState* previous_;
|
|
|
|
ThreadManager* thread_manager_;
|
|
|
|
friend class ThreadManager;
|
|
};
|
|
|
|
class ThreadVisitor {
|
|
public:
|
|
// ThreadLocalTop may be only available during this call.
|
|
virtual void VisitThread(Isolate* isolate, ThreadLocalTop* top) = 0;
|
|
|
|
protected:
|
|
virtual ~ThreadVisitor() {}
|
|
};
|
|
|
|
class ThreadManager {
|
|
public:
|
|
void Lock();
|
|
void Unlock();
|
|
|
|
void ArchiveThread();
|
|
bool RestoreThread();
|
|
void FreeThreadResources();
|
|
bool IsArchived();
|
|
|
|
void Iterate(RootVisitor* v);
|
|
void IterateArchivedThreads(ThreadVisitor* v);
|
|
bool IsLockedByCurrentThread() {
|
|
return mutex_owner_.Equals(ThreadId::Current());
|
|
}
|
|
|
|
ThreadId CurrentId();
|
|
|
|
void TerminateExecution(ThreadId thread_id);
|
|
|
|
// Iterate over in-use states.
|
|
ThreadState* FirstThreadStateInUse();
|
|
ThreadState* GetFreeThreadState();
|
|
|
|
private:
|
|
ThreadManager();
|
|
~ThreadManager();
|
|
|
|
void DeleteThreadStateList(ThreadState* anchor);
|
|
|
|
void EagerlyArchiveThread();
|
|
|
|
base::Mutex mutex_;
|
|
ThreadId mutex_owner_;
|
|
ThreadId lazily_archived_thread_;
|
|
ThreadState* lazily_archived_thread_state_;
|
|
|
|
// In the following two lists there is always at least one object on the list.
|
|
// The first object is a flying anchor that is only there to simplify linking
|
|
// and unlinking.
|
|
// Head of linked list of free states.
|
|
ThreadState* free_anchor_;
|
|
// Head of linked list of states in use.
|
|
ThreadState* in_use_anchor_;
|
|
|
|
Isolate* isolate_;
|
|
|
|
friend class Isolate;
|
|
friend class ThreadState;
|
|
};
|
|
|
|
|
|
} // namespace internal
|
|
} // namespace v8
|
|
|
|
#endif // V8_V8THREADS_H_
|