// 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 group. class ThreadRegistry { public: ThreadRegistry() : threads_lock_(), active_list_(nullptr), free_list_(nullptr), active_isolates_count_(0) {} ~ThreadRegistry(); void VisitObjectPointers(IsolateGroup* isolate_group_of_interest, ObjectPointerVisitor* visitor, ValidationPolicy validate_frames); void ForEachThread(std::function callback); void ReleaseStoreBuffers(); void AcquireMarkingStacks(); void ReleaseMarkingStacks(); void FlushMarkingStacks(); intptr_t StealActiveMutators(ThreadPool* pool); // Concurrent-approximate number of active isolates in the active_list intptr_t active_isolates_count() { return active_isolates_count_.load(); } Monitor* threads_lock() const { return &threads_lock_; } #ifndef PRODUCT void PrintJSON(JSONStream* stream) const; #endif private: Thread* active_list() const { return active_list_; } 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. RelaxedAtomic active_isolates_count_; friend class Thread; friend class SafepointHandler; DISALLOW_COPY_AND_ASSIGN(ThreadRegistry); }; } // namespace dart #endif // RUNTIME_VM_THREAD_REGISTRY_H_