Changeset 126354 in webkit for trunk/Source/JavaScriptCore/heap/MarkStack.h
- Timestamp:
- Aug 22, 2012, 2:49:16 PM (13 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/heap/MarkStack.h
r123690 r126354 75 75 class JSGlobalData; 76 76 class MarkStack; 77 class GCThreadSharedData; 77 78 class ParallelModeEnabler; 78 79 class Register; … … 193 194 }; 194 195 195 class MarkStackThreadSharedData {196 public:197 MarkStackThreadSharedData(JSGlobalData*);198 ~MarkStackThreadSharedData();199 200 void reset();201 202 #if ENABLE(PARALLEL_GC)203 void resetChildren();204 size_t childVisitCount();205 size_t childDupStrings();206 #endif207 208 private:209 friend class MarkStack;210 friend class SlotVisitor;211 212 #if ENABLE(PARALLEL_GC)213 void markingThreadMain(SlotVisitor*);214 static void markingThreadStartFunc(void* heap);215 #endif216 217 JSGlobalData* m_globalData;218 CopiedSpace* m_copiedSpace;219 220 MarkStackSegmentAllocator m_segmentAllocator;221 222 bool m_shouldHashConst;223 224 Vector<ThreadIdentifier> m_markingThreads;225 Vector<MarkStack*> m_markingThreadsMarkStack;226 227 Mutex m_markingLock;228 ThreadCondition m_markingCondition;229 MarkStackArray m_sharedMarkStack;230 unsigned m_numberOfActiveParallelMarkers;231 bool m_parallelMarkersShouldExit;232 233 Mutex m_opaqueRootsLock;234 HashSet<void*> m_opaqueRoots;235 236 ListableHandler<WeakReferenceHarvester>::List m_weakReferenceHarvesters;237 ListableHandler<UnconditionalFinalizer>::List m_unconditionalFinalizers;238 };239 240 196 class MarkStack { 241 197 WTF_MAKE_NONCOPYABLE(MarkStack); … … 243 199 244 200 public: 245 MarkStack( MarkStackThreadSharedData&);201 MarkStack(GCThreadSharedData&); 246 202 ~MarkStack(); 247 203 … … 260 216 int opaqueRootCount(); 261 217 262 MarkStackThreadSharedData& sharedData() { return m_shared; }218 GCThreadSharedData& sharedData() { return m_shared; } 263 219 bool isEmpty() { return m_stack.isEmpty(); } 264 220 … … 272 228 #endif 273 229 274 void addWeakReferenceHarvester(WeakReferenceHarvester* weakReferenceHarvester) 275 { 276 m_shared.m_weakReferenceHarvesters.addThreadSafe(weakReferenceHarvester); 277 } 278 279 void addUnconditionalFinalizer(UnconditionalFinalizer* unconditionalFinalizer) 280 { 281 m_shared.m_unconditionalFinalizers.addThreadSafe(unconditionalFinalizer); 282 } 230 void addWeakReferenceHarvester(WeakReferenceHarvester*); 231 void addUnconditionalFinalizer(UnconditionalFinalizer*); 283 232 284 233 #if ENABLE(OBJECT_MARK_LOGGING) … … 329 278 bool m_isInParallelMode; 330 279 331 MarkStackThreadSharedData& m_shared;280 GCThreadSharedData& m_shared; 332 281 333 282 bool m_shouldHashConst; // Local per-thread copy of shared flag for performance reasons … … 339 288 #endif 340 289 }; 341 342 inline MarkStack::MarkStack(MarkStackThreadSharedData& shared)343 : m_stack(shared.m_segmentAllocator)344 #if !ASSERT_DISABLED345 , m_isCheckingForDefaultMarkViolation(false)346 , m_isDraining(false)347 #endif348 , m_visitCount(0)349 , m_isInParallelMode(false)350 , m_shared(shared)351 , m_shouldHashConst(false)352 {353 }354 355 inline MarkStack::~MarkStack()356 {357 ASSERT(m_stack.isEmpty());358 }359 360 inline void MarkStack::addOpaqueRoot(void* root)361 {362 #if ENABLE(PARALLEL_GC)363 if (Options::numberOfGCMarkers() == 1) {364 // Put directly into the shared HashSet.365 m_shared.m_opaqueRoots.add(root);366 return;367 }368 // Put into the local set, but merge with the shared one every once in369 // a while to make sure that the local sets don't grow too large.370 mergeOpaqueRootsIfProfitable();371 m_opaqueRoots.add(root);372 #else373 m_opaqueRoots.add(root);374 #endif375 }376 377 inline bool MarkStack::containsOpaqueRoot(void* root)378 {379 ASSERT(!m_isInParallelMode);380 #if ENABLE(PARALLEL_GC)381 ASSERT(m_opaqueRoots.isEmpty());382 return m_shared.m_opaqueRoots.contains(root);383 #else384 return m_opaqueRoots.contains(root);385 #endif386 }387 388 inline int MarkStack::opaqueRootCount()389 {390 ASSERT(!m_isInParallelMode);391 #if ENABLE(PARALLEL_GC)392 ASSERT(m_opaqueRoots.isEmpty());393 return m_shared.m_opaqueRoots.size();394 #else395 return m_opaqueRoots.size();396 #endif397 }398 290 399 291 inline void MarkStackArray::append(const JSCell* cell) … … 430 322 } 431 323 432 ALWAYS_INLINE void MarkStack::append(JSValue* slot, size_t count)433 {434 for (size_t i = 0; i < count; ++i) {435 JSValue& value = slot[i];436 if (!value)437 continue;438 internalAppend(value);439 }440 }441 442 template<typename T>443 inline void MarkStack::appendUnbarrieredPointer(T** slot)444 {445 ASSERT(slot);446 JSCell* cell = *slot;447 if (cell)448 internalAppend(cell);449 }450 451 ALWAYS_INLINE void MarkStack::append(JSValue* slot)452 {453 ASSERT(slot);454 internalAppend(*slot);455 }456 457 ALWAYS_INLINE void MarkStack::appendUnbarrieredValue(JSValue* slot)458 {459 ASSERT(slot);460 internalAppend(*slot);461 }462 463 ALWAYS_INLINE void MarkStack::append(JSCell** slot)464 {465 ASSERT(slot);466 internalAppend(*slot);467 }468 469 ALWAYS_INLINE void MarkStack::internalAppend(JSValue value)470 {471 ASSERT(value);472 if (!value.isCell())473 return;474 internalAppend(value.asCell());475 }476 477 324 class ParallelModeEnabler { 478 325 public:
Note:
See TracChangeset
for help on using the changeset viewer.