• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are
4 // met:
5 //
6 //     * Redistributions of source code must retain the above copyright
7 //       notice, this list of conditions and the following disclaimer.
8 //     * Redistributions in binary form must reproduce the above
9 //       copyright notice, this list of conditions and the following
10 //       disclaimer in the documentation and/or other materials provided
11 //       with the distribution.
12 //     * Neither the name of Google Inc. nor the names of its
13 //       contributors may be used to endorse or promote products derived
14 //       from this software without specific prior written permission.
15 //
16 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
17 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
18 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
19 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
20 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
21 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
22 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
23 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
24 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
26 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
27 
28 #ifndef V8_V8THREADS_H_
29 #define V8_V8THREADS_H_
30 
31 namespace v8 {
32 namespace internal {
33 
34 
35 class ThreadState {
36  public:
37   // Returns NULL after the last one.
38   ThreadState* Next();
39 
40   enum List {FREE_LIST, IN_USE_LIST};
41 
42   void LinkInto(List list);
43   void Unlink();
44 
45   // Id of thread.
set_id(ThreadId id)46   void set_id(ThreadId id) { id_ = id; }
id()47   ThreadId id() { return id_; }
48 
49   // Should the thread be terminated when it is restored?
terminate_on_restore()50   bool terminate_on_restore() { return terminate_on_restore_; }
set_terminate_on_restore(bool terminate_on_restore)51   void set_terminate_on_restore(bool terminate_on_restore) {
52     terminate_on_restore_ = terminate_on_restore;
53   }
54 
55   // Get data area for archiving a thread.
data()56   char* data() { return data_; }
57 
58  private:
59   explicit ThreadState(ThreadManager* thread_manager);
60   ~ThreadState();
61 
62   void AllocateSpace();
63 
64   ThreadId id_;
65   bool terminate_on_restore_;
66   char* data_;
67   ThreadState* next_;
68   ThreadState* previous_;
69 
70   ThreadManager* thread_manager_;
71 
72   friend class ThreadManager;
73 };
74 
75 
76 // Defined in isolate.h.
77 class ThreadLocalTop;
78 
79 
80 class ThreadVisitor {
81  public:
82   // ThreadLocalTop may be only available during this call.
83   virtual void VisitThread(Isolate* isolate, ThreadLocalTop* top) = 0;
84 
85  protected:
~ThreadVisitor()86   virtual ~ThreadVisitor() {}
87 };
88 
89 
90 class ThreadManager {
91  public:
92   void Lock();
93   void Unlock();
94 
95   void ArchiveThread();
96   bool RestoreThread();
97   void FreeThreadResources();
98   bool IsArchived();
99 
100   void Iterate(ObjectVisitor* v);
101   void IterateArchivedThreads(ThreadVisitor* v);
IsLockedByCurrentThread()102   bool IsLockedByCurrentThread() {
103     return mutex_owner_.Equals(ThreadId::Current());
104   }
105 
106   ThreadId CurrentId();
107 
108   void TerminateExecution(ThreadId thread_id);
109 
110   // Iterate over in-use states.
111   ThreadState* FirstThreadStateInUse();
112   ThreadState* GetFreeThreadState();
113 
114  private:
115   ThreadManager();
116   ~ThreadManager();
117 
118   void DeleteThreadStateList(ThreadState* anchor);
119 
120   void EagerlyArchiveThread();
121 
122   Mutex mutex_;
123   ThreadId mutex_owner_;
124   ThreadId lazily_archived_thread_;
125   ThreadState* lazily_archived_thread_state_;
126 
127   // In the following two lists there is always at least one object on the list.
128   // The first object is a flying anchor that is only there to simplify linking
129   // and unlinking.
130   // Head of linked list of free states.
131   ThreadState* free_anchor_;
132   // Head of linked list of states in use.
133   ThreadState* in_use_anchor_;
134 
135   Isolate* isolate_;
136 
137   friend class Isolate;
138   friend class ThreadState;
139 };
140 
141 
142 } }  // namespace v8::internal
143 
144 #endif  // V8_V8THREADS_H_
145