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

Side by Side Diff: Source/platform/heap/ThreadState.cpp

Issue 525353002: [oilpan]: optimize the way we allocate persistent handles in wrappers. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Created 6 years, 3 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 /* 1 /*
2 * Copyright (C) 2013 Google Inc. All rights reserved. 2 * Copyright (C) 2013 Google Inc. All rights reserved.
3 * 3 *
4 * Redistribution and use in source and binary forms, with or without 4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions are 5 * modification, are permitted provided that the following conditions are
6 * met: 6 * met:
7 * 7 *
8 * * Redistributions of source code must retain the above copyright 8 * * Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer. 9 * notice, this list of conditions and the following disclaimer.
10 * * Redistributions in binary form must reproduce the above 10 * * Redistributions in binary form must reproduce the above
(...skipping 247 matching lines...) Expand 10 before | Expand all | Expand 10 after
258 barrier->doEnterSafePoint(state, stackEnd); 258 barrier->doEnterSafePoint(state, stackEnd);
259 } 259 }
260 260
261 volatile int m_canResume; 261 volatile int m_canResume;
262 volatile int m_unparkedThreadCount; 262 volatile int m_unparkedThreadCount;
263 Mutex m_mutex; 263 Mutex m_mutex;
264 ThreadCondition m_parked; 264 ThreadCondition m_parked;
265 ThreadCondition m_resume; 265 ThreadCondition m_resume;
266 }; 266 };
267 267
268
269 BaseHeapPage::BaseHeapPage(PageMemory* storage, const GCInfo* gcInfo, ThreadStat e* state) 268 BaseHeapPage::BaseHeapPage(PageMemory* storage, const GCInfo* gcInfo, ThreadStat e* state)
270 : m_storage(storage) 269 : m_storage(storage)
271 , m_gcInfo(gcInfo) 270 , m_gcInfo(gcInfo)
272 , m_threadState(state) 271 , m_threadState(state)
273 , m_terminating(false) 272 , m_terminating(false)
274 , m_tracedAfterOrphaned(false) 273 , m_tracedAfterOrphaned(false)
275 { 274 {
276 ASSERT(isPageHeaderAddress(reinterpret_cast<Address>(this))); 275 ASSERT(isPageHeaderAddress(reinterpret_cast<Address>(this)));
277 } 276 }
278 277
279 // Statically unfold the heap initialization loop so the compiler statically 278 // Statically unfold the heap initialization loop so the compiler statically
280 // knows the heap index when using HeapIndexTrait. 279 // knows the heap index when using HeapIndexTrait.
281 template<int num> struct InitializeHeaps { 280 template<int num> struct InitializeHeaps {
282 static const int index = num - 1; 281 static const int index = num - 1;
283 static void init(BaseHeap** heaps, ThreadState* state) 282 static void init(BaseHeap** heaps, ThreadState* state)
284 { 283 {
285 InitializeHeaps<index>::init(heaps, state); 284 InitializeHeaps<index>::init(heaps, state);
286 heaps[index] = new typename HeapIndexTrait<index>::HeapType(state, index ); 285 heaps[index] = new typename HeapIndexTrait<index>::HeapType(state, index );
287 } 286 }
288 }; 287 };
289 template<> struct InitializeHeaps<0> { 288 template<> struct InitializeHeaps<0> {
290 static void init(BaseHeap** heaps, ThreadState* state) { } 289 static void init(BaseHeap** heaps, ThreadState* state) { }
291 }; 290 };
292 291
293 ThreadState::ThreadState() 292 ThreadState::ThreadState()
294 : m_thread(currentThread()) 293 : m_thread(currentThread())
294 , m_wrapperPersistents(new WrapperPersistentRegion())
295 , m_wrapperPersistentRegionPool(0)
296 , m_wrapperPersistentRegionPoolSize(0)
295 , m_persistents(adoptPtr(new PersistentAnchor())) 297 , m_persistents(adoptPtr(new PersistentAnchor()))
296 , m_startOfStack(reinterpret_cast<intptr_t*>(getStackStart())) 298 , m_startOfStack(reinterpret_cast<intptr_t*>(getStackStart()))
297 , m_endOfStack(reinterpret_cast<intptr_t*>(getStackStart())) 299 , m_endOfStack(reinterpret_cast<intptr_t*>(getStackStart()))
298 , m_safePointScopeMarker(0) 300 , m_safePointScopeMarker(0)
299 , m_atSafePoint(false) 301 , m_atSafePoint(false)
300 , m_interruptors() 302 , m_interruptors()
301 , m_gcRequested(false) 303 , m_gcRequested(false)
302 , m_forcePreciseGCForTesting(false) 304 , m_forcePreciseGCForTesting(false)
303 , m_sweepRequested(0) 305 , m_sweepRequested(0)
304 , m_sweepInProgress(false) 306 , m_sweepInProgress(false)
(...skipping 18 matching lines...) Expand all
323 m_sweeperThread = adoptPtr(blink::Platform::current()->createThread("Bli nk GC Sweeper")); 325 m_sweeperThread = adoptPtr(blink::Platform::current()->createThread("Bli nk GC Sweeper"));
324 } 326 }
325 327
326 ThreadState::~ThreadState() 328 ThreadState::~ThreadState()
327 { 329 {
328 checkThread(); 330 checkThread();
329 CallbackStack::shutdown(&m_weakCallbackStack); 331 CallbackStack::shutdown(&m_weakCallbackStack);
330 for (int i = 0; i < NumberOfHeaps; i++) 332 for (int i = 0; i < NumberOfHeaps; i++)
331 delete m_heaps[i]; 333 delete m_heaps[i];
332 deleteAllValues(m_interruptors); 334 deleteAllValues(m_interruptors);
335 while (m_wrapperPersistents) {
Mads Ager (chromium) 2014/09/01 13:52:46 How about regions that are in the pool? Should we
wibling-chromium 2014/09/02 11:19:38 That seems like a good idea:) Fixed.
336 WrapperPersistentRegion* region = WrapperPersistentRegion::removeHead(&m _wrapperPersistents);
337 delete region;
338 }
333 **s_threadSpecific = 0; 339 **s_threadSpecific = 0;
334 } 340 }
335 341
336 void ThreadState::init() 342 void ThreadState::init()
337 { 343 {
338 s_threadSpecific = new WTF::ThreadSpecific<ThreadState*>(); 344 s_threadSpecific = new WTF::ThreadSpecific<ThreadState*>();
339 s_safePointBarrier = new SafePointBarrier; 345 s_safePointBarrier = new SafePointBarrier;
340 } 346 }
341 347
342 void ThreadState::shutdown() 348 void ThreadState::shutdown()
(...skipping 211 matching lines...) Expand 10 before | Expand all | Expand 10 after
554 __msan_unpoison(&ptr, sizeof(ptr)); 560 __msan_unpoison(&ptr, sizeof(ptr));
555 #endif 561 #endif
556 Heap::checkAndMarkPointer(visitor, ptr); 562 Heap::checkAndMarkPointer(visitor, ptr);
557 visitAsanFakeStackForPointer(visitor, ptr); 563 visitAsanFakeStackForPointer(visitor, ptr);
558 } 564 }
559 } 565 }
560 566
561 void ThreadState::visitPersistents(Visitor* visitor) 567 void ThreadState::visitPersistents(Visitor* visitor)
562 { 568 {
563 m_persistents->trace(visitor); 569 m_persistents->trace(visitor);
570 m_wrapperPersistents->trace(visitor);
564 } 571 }
565 572
566 bool ThreadState::checkAndMarkPointer(Visitor* visitor, Address address) 573 bool ThreadState::checkAndMarkPointer(Visitor* visitor, Address address)
567 { 574 {
568 // If thread is terminating ignore conservative pointers. 575 // If thread is terminating ignore conservative pointers.
569 if (m_isTerminating) 576 if (m_isTerminating)
570 return false; 577 return false;
571 578
572 // This checks for normal pages and for large objects which span the extent 579 // This checks for normal pages and for large objects which span the extent
573 // of several normal pages. 580 // of several normal pages.
(...skipping 99 matching lines...) Expand 10 before | Expand all | Expand 10 after
673 { 680 {
674 CallbackStack::Item* slot = m_weakCallbackStack->allocateEntry(&m_weakCallba ckStack); 681 CallbackStack::Item* slot = m_weakCallbackStack->allocateEntry(&m_weakCallba ckStack);
675 *slot = CallbackStack::Item(object, callback); 682 *slot = CallbackStack::Item(object, callback);
676 } 683 }
677 684
678 bool ThreadState::popAndInvokeWeakPointerCallback(Visitor* visitor) 685 bool ThreadState::popAndInvokeWeakPointerCallback(Visitor* visitor)
679 { 686 {
680 return m_weakCallbackStack->popAndInvokeCallback<WeaknessProcessing>(&m_weak CallbackStack, visitor); 687 return m_weakCallbackStack->popAndInvokeCallback<WeaknessProcessing>(&m_weak CallbackStack, visitor);
681 } 688 }
682 689
690 WrapperPersistentRegion* ThreadState::addWrapperPersistentRegion()
691 {
692 WrapperPersistentRegion* region;
693 if (m_wrapperPersistentRegionPoolSize) {
694 region = WrapperPersistentRegion::removeHead(&m_wrapperPersistentRegionP ool);
695 m_wrapperPersistentRegionPoolSize--;
696 } else {
697 region = new WrapperPersistentRegion();
698 }
699 ASSERT(region);
700 WrapperPersistentRegion::insertHead(&m_wrapperPersistents, region);
701 return region;
702 }
703
704 void ThreadState::removeWrapperPersistentRegion(WrapperPersistentRegion* region)
705 {
706 ASSERT(!region->count());
707 if (!region->removeIfNotLast(&m_wrapperPersistents))
708 return;
709
710 // Region was removed, ie. it is was not the last region in the list.
haraken 2014/09/02 05:22:06 it is was => it was
wibling-chromium 2014/09/02 11:19:38 Done.
711 if (m_wrapperPersistentRegionPoolSize < 2) {
haraken 2014/09/02 05:22:06 What does the '< 2' check mean?
wibling-chromium 2014/09/02 11:19:38 It means we will only keep at most two regions in
712 WrapperPersistentRegion::insertHead(&m_wrapperPersistentRegionPool, regi on);
713 m_wrapperPersistentRegionPoolSize++;
714 } else {
715 delete region;
716 }
717 }
718
683 PersistentNode* ThreadState::globalRoots() 719 PersistentNode* ThreadState::globalRoots()
684 { 720 {
685 AtomicallyInitializedStatic(PersistentNode*, anchor = new PersistentAnchor); 721 AtomicallyInitializedStatic(PersistentNode*, anchor = new PersistentAnchor);
686 return anchor; 722 return anchor;
687 } 723 }
688 724
689 Mutex& ThreadState::globalRootsMutex() 725 Mutex& ThreadState::globalRootsMutex()
690 { 726 {
691 AtomicallyInitializedStatic(Mutex&, mutex = *new Mutex); 727 AtomicallyInitializedStatic(Mutex&, mutex = *new Mutex);
692 return mutex; 728 return mutex;
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
1194 return gcInfo; 1230 return gcInfo;
1195 } 1231 }
1196 } 1232 }
1197 if (needLockForIteration) 1233 if (needLockForIteration)
1198 threadAttachMutex().unlock(); 1234 threadAttachMutex().unlock();
1199 return 0; 1235 return 0;
1200 } 1236 }
1201 #endif 1237 #endif
1202 1238
1203 } 1239 }
OLDNEW
« Source/platform/heap/ThreadState.h ('K') | « Source/platform/heap/ThreadState.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698