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

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

Issue 1292353004: Safepointing in GC (Closed) Base URL: git@github.com:dart-lang/sdk.git@master
Patch Set: Scavenger again. Created 5 years, 4 months 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
OLDNEW
1 // Copyright (c) 2015, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2015, 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_THREAD_H_ 5 #ifndef VM_THREAD_H_
6 #define VM_THREAD_H_ 6 #define VM_THREAD_H_
7 7
8 #include "vm/globals.h" 8 #include "vm/globals.h"
9 #include "vm/os_thread.h" 9 #include "vm/os_thread.h"
10 #include "vm/store_buffer.h" 10 #include "vm/store_buffer.h"
(...skipping 20 matching lines...) Expand all
31 V(RawBool*, bool_false_, Object::bool_false().raw(), NULL) \ 31 V(RawBool*, bool_false_, Object::bool_false().raw(), NULL) \
32 32
33 #define CACHED_ADDRESSES_LIST(V) \ 33 #define CACHED_ADDRESSES_LIST(V) \
34 V(uword, update_store_buffer_entry_point_, \ 34 V(uword, update_store_buffer_entry_point_, \
35 StubCode::UpdateStoreBuffer_entry()->EntryPoint(), 0) 35 StubCode::UpdateStoreBuffer_entry()->EntryPoint(), 0)
36 36
37 #define CACHED_CONSTANTS_LIST(V) \ 37 #define CACHED_CONSTANTS_LIST(V) \
38 CACHED_VM_OBJECTS_LIST(V) \ 38 CACHED_VM_OBJECTS_LIST(V) \
39 CACHED_ADDRESSES_LIST(V) 39 CACHED_ADDRESSES_LIST(V)
40 40
41 // TODO(koda): Merge thread.h and thread_registry.h.
42 typedef int64_t SafepointId;
43 static const SafepointId kNoSafepointId = -1;
41 44
42 // A VM thread; may be executing Dart code or performing helper tasks like 45 // A VM thread; may be executing Dart code or performing helper tasks like
43 // garbage collection or compilation. The Thread structure associated with 46 // garbage collection or compilation. The Thread structure associated with
44 // a thread is allocated by EnsureInit before entering an isolate, and destroyed 47 // a thread is allocated by EnsureInit before entering an isolate, and destroyed
45 // automatically when the underlying OS thread exits. NOTE: On Windows, CleanUp 48 // automatically when the underlying OS thread exits. NOTE: On Windows, CleanUp
46 // must currently be called manually (issue 23474). 49 // must currently be called manually (issue 23474).
47 class Thread { 50 class Thread {
48 public: 51 public:
49 // The currently executing thread, or NULL if not yet initialized. 52 // The currently executing thread, or NULL if not yet initialized.
50 static Thread* Current() { 53 static Thread* Current() {
51 return reinterpret_cast<Thread*>(OSThread::GetThreadLocal(thread_key_)); 54 return reinterpret_cast<Thread*>(OSThread::GetThreadLocal(thread_key_));
52 } 55 }
53 56
54 // Initializes the current thread as a VM thread, if not already done. 57 // Initializes the current thread as a VM thread, if not already done.
55 static void EnsureInit(); 58 static void EnsureInit();
56 59
57 // Makes the current thread enter 'isolate'. 60 // Makes the current thread enter 'isolate'.
58 static void EnterIsolate(Isolate* isolate); 61 static void EnterIsolate(Isolate* isolate);
59 // Makes the current thread exit its isolate. 62 // Makes the current thread exit its isolate.
60 static void ExitIsolate(); 63 static void ExitIsolate();
61 64
62 // A VM thread other than the main mutator thread can enter an isolate as a 65 // A VM thread other than the main mutator thread can enter an isolate as a
63 // "helper" to gain limited concurrent access to the isolate. One example is 66 // "helper" to gain limited concurrent access to the isolate. One example is
64 // SweeperTask (which uses the class table, which is copy-on-write). 67 // SweeperTask (which uses the class table, which is copy-on-write).
65 // TODO(koda): Properly synchronize heap access to expand allowed operations. 68 // TODO(koda): Properly synchronize heap access to expand allowed operations.
66 static void EnterIsolateAsHelper(Isolate* isolate); 69 //
70 // If 'pass_safepoint' is set to the current rendezvous (returned by
71 // ThreadRegistry::SafepointThreads), the thread will be allowed free passage
72 // into the isolate while this rendezvous is in progress.
73 static void EnterIsolateAsHelper(
74 Isolate* isolate,
75 SafepointId pass_safepoint = kNoSafepointId);
67 static void ExitIsolateAsHelper(); 76 static void ExitIsolateAsHelper();
68 77
69 // Called when the current thread transitions from mutator to collector. 78 // Called when the current thread transitions from mutator to collector.
70 // Empties the store buffer block into the isolate. 79 // Empties the store buffer block into the isolate.
71 // TODO(koda): Always run GC in separate thread. 80 // TODO(koda): Always run GC in separate thread.
72 static void PrepareForGC(); 81 static void PrepareForGC();
73 82
74 #if defined(TARGET_OS_WINDOWS) 83 #if defined(TARGET_OS_WINDOWS)
75 // Clears the state of the current thread and frees the allocation. 84 // Clears the state of the current thread and frees the allocation.
76 static void CleanUp(); 85 static void CleanUp();
(...skipping 149 matching lines...) Expand 10 before | Expand all | Expand 10 after
226 state_.timeline_block = block; 235 state_.timeline_block = block;
227 } 236 }
228 237
229 private: 238 private:
230 static ThreadLocalKey thread_key_; 239 static ThreadLocalKey thread_key_;
231 240
232 Isolate* isolate_; 241 Isolate* isolate_;
233 Heap* heap_; 242 Heap* heap_;
234 State state_; 243 State state_;
235 StoreBufferBlock* store_buffer_block_; 244 StoreBufferBlock* store_buffer_block_;
245 SafepointId pass_safepoint_;
236 #define DECLARE_MEMBERS(type_name, member_name, expr, default_init_value) \ 246 #define DECLARE_MEMBERS(type_name, member_name, expr, default_init_value) \
237 type_name member_name; 247 type_name member_name;
238 CACHED_CONSTANTS_LIST(DECLARE_MEMBERS) 248 CACHED_CONSTANTS_LIST(DECLARE_MEMBERS)
239 #undef DECLARE_MEMBERS 249 #undef DECLARE_MEMBERS
240 250
241 explicit Thread(bool init_vm_constants = true); 251 explicit Thread(bool init_vm_constants = true);
242 252
243 void InitVMConstants(); 253 void InitVMConstants();
244 254
245 void ClearState() { 255 void ClearState() {
(...skipping 16 matching lines...) Expand all
262 friend class ApiZone; 272 friend class ApiZone;
263 friend class Isolate; 273 friend class Isolate;
264 friend class StackZone; 274 friend class StackZone;
265 friend class ThreadRegistry; 275 friend class ThreadRegistry;
266 DISALLOW_COPY_AND_ASSIGN(Thread); 276 DISALLOW_COPY_AND_ASSIGN(Thread);
267 }; 277 };
268 278
269 } // namespace dart 279 } // namespace dart
270 280
271 #endif // VM_THREAD_H_ 281 #endif // VM_THREAD_H_
OLDNEW
« runtime/vm/gc_sweeper.cc ('K') | « runtime/vm/scavenger.cc ('k') | runtime/vm/thread.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698