| Index: src/v8threads.h
 | 
| ===================================================================
 | 
| --- src/v8threads.h	(revision 3427)
 | 
| +++ src/v8threads.h	(working copy)
 | 
| @@ -68,17 +68,65 @@
 | 
|    char* data_;
 | 
|    ThreadState* next_;
 | 
|    ThreadState* previous_;
 | 
| +  friend class ThreadManagerData;
 | 
| +};
 | 
|  
 | 
| +// The ContextSwitcher thread is used to schedule regular preemptions to
 | 
| +// multiple running V8 threads. Generally it is necessary to call
 | 
| +// StartPreemption if there is more than one thread running. If not, a single
 | 
| +// JavaScript can take full control of V8 and not allow other threads to run.
 | 
| +class ContextSwitcher: public Thread {
 | 
| + public:
 | 
| +  // Set the preemption interval for the ContextSwitcher thread.
 | 
| +  static void StartPreemption(int every_n_ms);
 | 
| +
 | 
| +  // Stop sending preemption requests to threads.
 | 
| +  static void StopPreemption();
 | 
| +
 | 
| +  // Preempted thread needs to call back to the ContextSwitcher to acknowledge
 | 
| +  // the handling of a preemption request.
 | 
| +  static void PreemptionReceived();
 | 
| +
 | 
| + private:
 | 
| +  explicit ContextSwitcher(int every_n_ms);
 | 
| +
 | 
| +  void Run();
 | 
| +
 | 
| +  bool keep_going_;
 | 
| +  int sleep_ms_;
 | 
| +};
 | 
| +
 | 
| +class ThreadManagerData {
 | 
| +  int last_id_;  // V8 threads are identified through an integer.
 | 
| +  Mutex* mutex_;
 | 
| +  ThreadHandle mutex_owner_;
 | 
| +  ThreadHandle 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.
 | 
| -  static ThreadState* free_anchor_;
 | 
| +  ThreadState* free_anchor_;
 | 
|    // Head of linked list of states in use.
 | 
| -  static ThreadState* in_use_anchor_;
 | 
| +  ThreadState* in_use_anchor_;
 | 
| +
 | 
| +  // This is the ContextSwitcher singleton. There is at most a single thread
 | 
| +  // running which delivers preemption events to V8 threads.
 | 
| +  ContextSwitcher* singleton_;
 | 
| +
 | 
| +  Thread::LocalStorageKey thread_state_key_;
 | 
| +  Thread::LocalStorageKey thread_id_key_;
 | 
| +
 | 
| +  friend class ThreadManager;
 | 
| +  friend class ThreadState;
 | 
| +  friend class V8Context;
 | 
| +  friend class ContextSwitcher;
 | 
| +
 | 
| +  ThreadManagerData();
 | 
| +  DISALLOW_COPY_AND_ASSIGN(ThreadManagerData);
 | 
|  };
 | 
|  
 | 
| -
 | 
|  class ThreadManager : public AllStatic {
 | 
|   public:
 | 
|    static void Lock();
 | 
| @@ -92,7 +140,9 @@
 | 
|    static void Iterate(ObjectVisitor* v);
 | 
|    static void MarkCompactPrologue(bool is_compacting);
 | 
|    static void MarkCompactEpilogue(bool is_compacting);
 | 
| -  static bool IsLockedByCurrentThread() { return mutex_owner_.IsSelf(); }
 | 
| +  static bool IsLockedByCurrentThread() {
 | 
| +    return v8_context()->thread_manager_data_.mutex_owner_.IsSelf();
 | 
| +  }
 | 
|  
 | 
|    static int CurrentId();
 | 
|    static void AssignId();
 | 
| @@ -103,42 +153,8 @@
 | 
|    static const int kInvalidId = -1;
 | 
|   private:
 | 
|    static void EagerlyArchiveThread();
 | 
| -
 | 
| -  static int last_id_;  // V8 threads are identified through an integer.
 | 
| -  static Mutex* mutex_;
 | 
| -  static ThreadHandle mutex_owner_;
 | 
| -  static ThreadHandle lazily_archived_thread_;
 | 
| -  static ThreadState* lazily_archived_thread_state_;
 | 
|  };
 | 
|  
 | 
| -
 | 
| -// The ContextSwitcher thread is used to schedule regular preemptions to
 | 
| -// multiple running V8 threads. Generally it is necessary to call
 | 
| -// StartPreemption if there is more than one thread running. If not, a single
 | 
| -// JavaScript can take full control of V8 and not allow other threads to run.
 | 
| -class ContextSwitcher: public Thread {
 | 
| - public:
 | 
| -  // Set the preemption interval for the ContextSwitcher thread.
 | 
| -  static void StartPreemption(int every_n_ms);
 | 
| -
 | 
| -  // Stop sending preemption requests to threads.
 | 
| -  static void StopPreemption();
 | 
| -
 | 
| -  // Preempted thread needs to call back to the ContextSwitcher to acknowledge
 | 
| -  // the handling of a preemption request.
 | 
| -  static void PreemptionReceived();
 | 
| -
 | 
| - private:
 | 
| -  explicit ContextSwitcher(int every_n_ms);
 | 
| -
 | 
| -  void Run();
 | 
| -
 | 
| -  bool keep_going_;
 | 
| -  int sleep_ms_;
 | 
| -
 | 
| -  static ContextSwitcher* singleton_;
 | 
| -};
 | 
| -
 | 
|  } }  // namespace v8::internal
 | 
|  
 | 
|  #endif  // V8_V8THREADS_H_
 | 
| 
 |