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

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

Issue 794223003: Cheaper thread-safe atomic initialization of static references. (Closed) Base URL: https://chromium.googlesource.com/chromium/blink.git@master
Patch Set: Add type check for initial value Created 5 years, 11 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 124 matching lines...) Expand 10 before | Expand all | Expand 10 after
135 } 135 }
136 136
137 WTF::ThreadSpecific<ThreadState*>* ThreadState::s_threadSpecific = nullptr; 137 WTF::ThreadSpecific<ThreadState*>* ThreadState::s_threadSpecific = nullptr;
138 uintptr_t ThreadState::s_mainThreadStackStart = 0; 138 uintptr_t ThreadState::s_mainThreadStackStart = 0;
139 uintptr_t ThreadState::s_mainThreadUnderestimatedStackSize = 0; 139 uintptr_t ThreadState::s_mainThreadUnderestimatedStackSize = 0;
140 uint8_t ThreadState::s_mainThreadStateStorage[sizeof(ThreadState)]; 140 uint8_t ThreadState::s_mainThreadStateStorage[sizeof(ThreadState)];
141 SafePointBarrier* ThreadState::s_safePointBarrier = nullptr; 141 SafePointBarrier* ThreadState::s_safePointBarrier = nullptr;
142 142
143 static Mutex& threadAttachMutex() 143 static Mutex& threadAttachMutex()
144 { 144 {
145 AtomicallyInitializedStatic(Mutex&, mutex = *new Mutex); 145 AtomicallyInitializedStaticReference(Mutex, mutex, (new Mutex));
146 return mutex; 146 return mutex;
147 } 147 }
148 148
149 static double lockingTimeout() 149 static double lockingTimeout()
150 { 150 {
151 // Wait time for parking all threads is at most 100 MS. 151 // Wait time for parking all threads is at most 100 MS.
152 return 0.100; 152 return 0.100;
153 } 153 }
154 154
155 155
(...skipping 325 matching lines...) Expand 10 before | Expand all | Expand 10 after
481 } 481 }
482 482
483 void ThreadState::visitPersistentRoots(Visitor* visitor) 483 void ThreadState::visitPersistentRoots(Visitor* visitor)
484 { 484 {
485 TRACE_EVENT0("blink_gc", "ThreadState::visitPersistentRoots"); 485 TRACE_EVENT0("blink_gc", "ThreadState::visitPersistentRoots");
486 { 486 {
487 // All threads are at safepoints so this is not strictly necessary. 487 // All threads are at safepoints so this is not strictly necessary.
488 // However we acquire the mutex to make mutation and traversal of this 488 // However we acquire the mutex to make mutation and traversal of this
489 // list symmetrical. 489 // list symmetrical.
490 MutexLocker locker(globalRootsMutex()); 490 MutexLocker locker(globalRootsMutex());
491 globalRoots()->trace(visitor); 491 globalRoots().trace(visitor);
492 } 492 }
493 493
494 for (ThreadState* state : attachedThreads()) 494 for (ThreadState* state : attachedThreads())
495 state->visitPersistents(visitor); 495 state->visitPersistents(visitor);
496 } 496 }
497 497
498 void ThreadState::visitStackRoots(Visitor* visitor) 498 void ThreadState::visitStackRoots(Visitor* visitor)
499 { 499 {
500 TRACE_EVENT0("blink_gc", "ThreadState::visitStackRoots"); 500 TRACE_EVENT0("blink_gc", "ThreadState::visitStackRoots");
501 for (ThreadState* state : attachedThreads()) 501 for (ThreadState* state : attachedThreads())
(...skipping 175 matching lines...) Expand 10 before | Expand all | Expand 10 after
677 // registered as objects on orphaned pages. We cannot assert this here since 677 // registered as objects on orphaned pages. We cannot assert this here since
678 // we might have an off-heap collection. We assert it in 678 // we might have an off-heap collection. We assert it in
679 // Heap::pushWeakPointerCallback. 679 // Heap::pushWeakPointerCallback.
680 if (CallbackStack::Item* item = m_weakCallbackStack->pop()) { 680 if (CallbackStack::Item* item = m_weakCallbackStack->pop()) {
681 item->call(visitor); 681 item->call(visitor);
682 return true; 682 return true;
683 } 683 }
684 return false; 684 return false;
685 } 685 }
686 686
687 PersistentNode* ThreadState::globalRoots() 687 PersistentNode& ThreadState::globalRoots()
688 { 688 {
689 AtomicallyInitializedStatic(PersistentNode*, anchor = new PersistentAnchor); 689 AtomicallyInitializedStaticReference(PersistentNode, anchor, new PersistentA nchor);
690 return anchor; 690 return anchor;
691 } 691 }
692 692
693 Mutex& ThreadState::globalRootsMutex() 693 Mutex& ThreadState::globalRootsMutex()
694 { 694 {
695 AtomicallyInitializedStatic(Mutex&, mutex = *new Mutex); 695 AtomicallyInitializedStaticReference(Mutex, mutex, new Mutex);
696 return mutex; 696 return mutex;
697 } 697 }
698 698
699 // FIXME: We should improve the GC heuristics. 699 // FIXME: We should improve the GC heuristics.
700 // These heuristics affect performance significantly. 700 // These heuristics affect performance significantly.
701 bool ThreadState::shouldGC() 701 bool ThreadState::shouldGC()
702 { 702 {
703 // Trigger garbage collection on a 50% increase in size since the last GC, 703 // Trigger garbage collection on a 50% increase in size since the last GC,
704 // but not for less than 512 KB. 704 // but not for less than 512 KB.
705 size_t newSize = Heap::allocatedObjectSize(); 705 size_t newSize = Heap::allocatedObjectSize();
(...skipping 458 matching lines...) Expand 10 before | Expand all | Expand 10 after
1164 return gcInfo; 1164 return gcInfo;
1165 } 1165 }
1166 } 1166 }
1167 if (needLockForIteration) 1167 if (needLockForIteration)
1168 threadAttachMutex().unlock(); 1168 threadAttachMutex().unlock();
1169 return nullptr; 1169 return nullptr;
1170 } 1170 }
1171 #endif 1171 #endif
1172 1172
1173 } // namespace blink 1173 } // namespace blink
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698