// Copyright (c) 2015, 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 RUNTIME_VM_THREAD_REGISTRY_H_ #define RUNTIME_VM_THREAD_REGISTRY_H_ #include "vm/globals.h" #include "vm/growable_array.h" #include "vm/isolate.h" #include "vm/lockers.h" #include "vm/stack_frame.h" #include "vm/thread.h" namespace dart { #ifndef PRODUCT class JSONStream; class JSONArray; #endif // Unordered collection of threads relating to a particular isolate. class ThreadRegistry { public: ThreadRegistry() : threads_lock_(), active_list_(NULL), free_list_(NULL) {} ~ThreadRegistry(); void VisitObjectPointers(IsolateGroup* isolate_group_of_interest, ObjectPointerVisitor* visitor, ValidationPolicy validate_frames); void ReleaseStoreBuffers(); void AcquireMarkingStacks(); void ReleaseMarkingStacks(); #ifndef PRODUCT void PrintJSON(JSONStream* stream) const; #endif private: Thread* active_list() const { return active_list_; } Monitor* threads_lock() const { return &threads_lock_; } Thread* GetFreeThreadLocked(bool is_vm_isolate); void ReturnThreadLocked(Thread* thread); void AddToActiveListLocked(Thread* thread); void RemoveFromActiveListLocked(Thread* thread); Thread* GetFromFreelistLocked(bool is_vm_isolate); void ReturnToFreelistLocked(Thread* thread); // This monitor protects the threads list for an isolate, it is used whenever // we need to iterate over threads (both active and free) in an isolate. mutable Monitor threads_lock_; Thread* active_list_; // List of active threads in the isolate. Thread* free_list_; // Free list of Thread objects that can be reused. friend class Isolate; friend class IsolateGroup; friend class SafepointHandler; friend class Scavenger; DISALLOW_COPY_AND_ASSIGN(ThreadRegistry); }; } // namespace dart #endif // RUNTIME_VM_THREAD_REGISTRY_H_