Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(50)

Side by Side Diff: runtime/vm/os_thread.h

Issue 1537543002: Fix for issue 25236 (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: code-review-comments Created 5 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « runtime/vm/isolate.cc ('k') | runtime/vm/os_thread.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #ifndef VM_OS_THREAD_H_ 5 #ifndef VM_OS_THREAD_H_
6 #define VM_OS_THREAD_H_ 6 #define VM_OS_THREAD_H_
7 7
8 #include "platform/globals.h" 8 #include "platform/globals.h"
9 #include "vm/allocation.h" 9 #include "vm/allocation.h"
10 #include "vm/globals.h" 10 #include "vm/globals.h"
(...skipping 32 matching lines...) Expand 10 before | Expand all | Expand 10 after
43 friend class Thread; 43 friend class Thread;
44 friend class OSThread; 44 friend class OSThread;
45 45
46 DISALLOW_IMPLICIT_CONSTRUCTORS(BaseThread); 46 DISALLOW_IMPLICIT_CONSTRUCTORS(BaseThread);
47 }; 47 };
48 48
49 49
50 // Low-level operations on OS platform threads. 50 // Low-level operations on OS platform threads.
51 class OSThread : public BaseThread { 51 class OSThread : public BaseThread {
52 public: 52 public:
53 OSThread(); 53 // The constructor of OSThread is never called directly, instead we call
54 // this factory style method 'CreateOSThread' to create OSThread structures.
55 // The method can return a NULL if the Dart VM is in shutdown mode.
56 static OSThread* CreateOSThread();
54 ~OSThread(); 57 ~OSThread();
55 58
56 ThreadId id() const { 59 ThreadId id() const {
57 ASSERT(id_ != OSThread::kInvalidThreadId); 60 ASSERT(id_ != OSThread::kInvalidThreadId);
58 return id_; 61 return id_;
59 } 62 }
60 63
61 ThreadJoinId join_id() const { 64 ThreadJoinId join_id() const {
62 ASSERT(join_id_ != OSThread::kInvalidThreadJoinId); 65 ASSERT(join_id_ != OSThread::kInvalidThreadJoinId);
63 return join_id_; 66 return join_id_;
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
168 static intptr_t ThreadIdToIntPtr(ThreadId id); 171 static intptr_t ThreadIdToIntPtr(ThreadId id);
169 static ThreadId ThreadIdFromIntPtr(intptr_t id); 172 static ThreadId ThreadIdFromIntPtr(intptr_t id);
170 static bool Compare(ThreadId a, ThreadId b); 173 static bool Compare(ThreadId a, ThreadId b);
171 static void GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage); 174 static void GetThreadCpuUsage(ThreadId thread_id, int64_t* cpu_usage);
172 175
173 // Called at VM startup and shutdown. 176 // Called at VM startup and shutdown.
174 static void InitOnce(); 177 static void InitOnce();
175 178
176 static bool IsThreadInList(ThreadJoinId join_id); 179 static bool IsThreadInList(ThreadJoinId join_id);
177 180
181 static void DisableOSThreadCreation();
182 static void EnableOSThreadCreation();
183
178 static const intptr_t kStackSizeBuffer = (4 * KB * kWordSize); 184 static const intptr_t kStackSizeBuffer = (4 * KB * kWordSize);
179 185
180 static const ThreadId kInvalidThreadId; 186 static const ThreadId kInvalidThreadId;
181 static const ThreadJoinId kInvalidThreadJoinId; 187 static const ThreadJoinId kInvalidThreadJoinId;
182 188
183 private: 189 private:
190 // The constructor is private as CreateOSThread should be used
191 // to create a new OSThread structure.
192 OSThread();
193
184 // These methods should not be used in a generic way and hence 194 // These methods should not be used in a generic way and hence
185 // are private, they have been added to solve the problem of 195 // are private, they have been added to solve the problem of
186 // accessing the VM thread structure from an OSThread object 196 // accessing the VM thread structure from an OSThread object
187 // in the windows thread interrupter which is used for profiling. 197 // in the windows thread interrupter which is used for profiling.
188 // We could eliminate this requirement if the windows thread interrupter 198 // We could eliminate this requirement if the windows thread interrupter
189 // is implemented differently. 199 // is implemented differently.
190 Thread* thread() const { return thread_; } 200 Thread* thread() const { return thread_; }
191 void set_thread(Thread* value) { 201 void set_thread(Thread* value) {
192 thread_ = value; 202 thread_ = value;
193 } 203 }
194 204
195 static void Cleanup(); 205 static void Cleanup();
196 static ThreadId GetCurrentThreadTraceId(); 206 static ThreadId GetCurrentThreadTraceId();
197 static ThreadJoinId GetCurrentThreadJoinId(); 207 static ThreadJoinId GetCurrentThreadJoinId();
198 static OSThread* GetOSThreadFromThread(Thread* thread); 208 static OSThread* GetOSThreadFromThread(Thread* thread);
199 static void AddThreadToList(OSThread* thread); 209 static void AddThreadToListLocked(OSThread* thread);
200 static void RemoveThreadFromList(OSThread* thread); 210 static void RemoveThreadFromList(OSThread* thread);
201 static OSThread* CreateAndSetUnknownThread(); 211 static OSThread* CreateAndSetUnknownThread();
202 212
203 static ThreadLocalKey thread_key_; 213 static ThreadLocalKey thread_key_;
204 214
205 const ThreadId id_; 215 const ThreadId id_;
206 const ThreadJoinId join_id_; 216 const ThreadJoinId join_id_;
207 const ThreadId trace_id_; // Used to interface with tracing tools. 217 const ThreadId trace_id_; // Used to interface with tracing tools.
208 char* name_; // A name for this thread. 218 char* name_; // A name for this thread.
209 219
210 Mutex* timeline_block_lock_; 220 Mutex* timeline_block_lock_;
211 TimelineEventBlock* timeline_block_; 221 TimelineEventBlock* timeline_block_;
212 222
213 // All |Thread|s are registered in the thread list. 223 // All |Thread|s are registered in the thread list.
214 OSThread* thread_list_next_; 224 OSThread* thread_list_next_;
215 225
216 uintptr_t thread_interrupt_disabled_; 226 uintptr_t thread_interrupt_disabled_;
217 Log* log_; 227 Log* log_;
218 uword stack_base_; 228 uword stack_base_;
219 Thread* thread_; 229 Thread* thread_;
220 230
221 static OSThread* thread_list_head_; 231 static OSThread* thread_list_head_;
222 static Mutex* thread_list_lock_; 232 static Mutex* thread_list_lock_;
233 static bool creation_enabled_;
223 234
224 friend class OSThreadIterator; 235 friend class OSThreadIterator;
225 friend class ThreadInterrupterWin; 236 friend class ThreadInterrupterWin;
226 friend class ThreadRegistry; 237 friend class ThreadRegistry;
227 }; 238 };
228 239
229 240
230 // Note that this takes the thread list lock, prohibiting threads from coming 241 // Note that this takes the thread list lock, prohibiting threads from coming
231 // on- or off-line. 242 // on- or off-line.
232 class OSThreadIterator : public ValueObject { 243 class OSThreadIterator : public ValueObject {
(...skipping 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
316 #endif // defined(DEBUG) 327 #endif // defined(DEBUG)
317 328
318 DISALLOW_COPY_AND_ASSIGN(Monitor); 329 DISALLOW_COPY_AND_ASSIGN(Monitor);
319 }; 330 };
320 331
321 332
322 } // namespace dart 333 } // namespace dart
323 334
324 335
325 #endif // VM_OS_THREAD_H_ 336 #endif // VM_OS_THREAD_H_
OLDNEW
« no previous file with comments | « runtime/vm/isolate.cc ('k') | runtime/vm/os_thread.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698