Index: runtime/vm/thread_registry.h |
diff --git a/runtime/vm/thread_registry.h b/runtime/vm/thread_registry.h |
index 555e51368bd2f54e26875af2a91c50f77aeb3de3..c765a5d5ac23974b0083774046e9ecdb7de135c4 100644 |
--- a/runtime/vm/thread_registry.h |
+++ b/runtime/vm/thread_registry.h |
@@ -18,62 +18,32 @@ namespace dart { |
class ThreadRegistry { |
public: |
ThreadRegistry() |
- : monitor_(new Monitor()), |
+ : threads_lock_(new Monitor()), |
active_list_(NULL), |
free_list_(NULL), |
- mutator_thread_(NULL), |
- in_rendezvous_(false), |
- remaining_(0), |
- round_(0) {} |
- |
+ mutator_thread_(NULL) {} |
~ThreadRegistry(); |
- Thread* active_list() const { return active_list_; } |
- |
- // Bring all threads in this isolate to a safepoint. The caller is |
- // expected to be implicitly at a safepoint. The threads will wait |
- // until ResumeAllThreads is called. First participates in any |
- // already pending rendezvous requested by another thread. Any |
- // thread that tries to enter this isolate during rendezvous will |
- // wait in RestoreStateTo. Nesting is not supported: the caller must |
- // call ResumeAllThreads before making further calls to |
- // SafepointThreads. |
- void SafepointThreads(); |
- |
- // Unblocks all threads participating in the rendezvous that was organized |
- // by a prior call to SafepointThreads. |
- // TODO(koda): Consider adding a scope helper to avoid omitting this call. |
- void ResumeAllThreads(); |
- |
- // Indicate that the current thread is at a safepoint, and offer to wait for |
- // any pending rendezvous request (if none, returns immediately). |
- void CheckSafepoint() { |
- MonitorLocker ml(monitor_); |
- CheckSafepointLocked(); |
- } |
- |
- bool AtSafepoint() const { return in_rendezvous_; } |
- Thread* Schedule(Isolate* isolate, bool is_mutator, bool bypass_safepoint); |
- void Unschedule(Thread* thread, bool is_mutator, bool bypass_safepoint); |
void VisitObjectPointers(ObjectPointerVisitor* visitor, bool validate_frames); |
void PrepareForGC(); |
private: |
- void AddThreadToActiveList(Thread* thread); |
- void RemoveThreadFromActiveList(Thread* thread); |
- Thread* GetThreadFromFreelist(Isolate* isolate); |
- void ReturnThreadToFreelist(Thread* thread); |
- |
- // Note: Lock should be taken before this function is called. |
- void CheckSafepointLocked(); |
- |
- // Returns the number threads that are scheduled on this isolate. |
- // Note: Lock should be taken before this function is called. |
- intptr_t CountScheduledLocked(); |
- |
- Monitor* monitor_; // All access is synchronized through this monitor. |
+ Thread* active_list() const { return active_list_; } |
+ Monitor* threads_lock() const { return threads_lock_; } |
+ |
+ Thread* GetFreeThreadLocked(Isolate* isolate, bool is_mutator); |
+ void ReturnThreadLocked(bool is_mutator, Thread* thread); |
+ void AddToActiveListLocked(Thread* thread); |
+ void RemoveFromActiveListLocked(Thread* thread); |
+ Thread* GetFromFreelistLocked(Isolate* 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. |
+ 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. |
+ |
// TODO(asiva): Currently we treat a mutator thread as a special thread |
// and always schedule execution of Dart code on the same mutator thread |
// object. The ApiLocalScope has been made thread specific but we still |
@@ -89,12 +59,8 @@ class ThreadRegistry { |
// added. |
Thread* mutator_thread_; |
- // Safepoint rendezvous state. |
- bool in_rendezvous_; // A safepoint rendezvous request is in progress. |
- intptr_t remaining_; // Number of threads yet to reach their safepoint. |
- int64_t round_; // Counter, to prevent missing updates to remaining_ |
- // (see comments in CheckSafepointLocked). |
- |
+ friend class Isolate; |
+ friend class SafepointHandler; |
DISALLOW_COPY_AND_ASSIGN(ThreadRegistry); |
}; |