Changeset 264635 in webkit
- Timestamp:
- Jul 20, 2020, 4:36:01 PM (6 years ago)
- Location:
- trunk/Source
- Files:
-
- 8 edited
-
JavaScriptCore/ChangeLog (modified) (1 diff)
-
JavaScriptCore/runtime/DeferredWorkTimer.cpp (modified) (2 diffs)
-
JavaScriptCore/runtime/JSRunLoopTimer.cpp (modified) (8 diffs)
-
JavaScriptCore/runtime/JSRunLoopTimer.h (modified) (4 diffs)
-
JavaScriptCore/runtime/VM.cpp (modified) (3 diffs)
-
JavaScriptCore/runtime/VM.h (modified) (5 diffs)
-
WebCore/ChangeLog (modified) (1 diff)
-
WebCore/bindings/js/CommonVM.cpp (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/JavaScriptCore/ChangeLog
r264633 r264635 1 2020-07-20 Geoffrey Garen <ggaren@apple.com> 2 3 REGRESSION (r264242): [ macOS ] imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate.any.html is a flaky crash 4 https://bugs.webkit.org/show_bug.cgi?id=214572 5 6 Unreviewed, reverting r264242. 7 8 * runtime/JSRunLoopTimer.cpp: 9 (JSC::epochTime): 10 (JSC::JSRunLoopTimer::Manager::timerDidFireCallback): 11 (JSC::JSRunLoopTimer::Manager::PerVMData::setRunLoop): 12 (JSC::JSRunLoopTimer::Manager::PerVMData::PerVMData): 13 (JSC::JSRunLoopTimer::Manager::PerVMData::~PerVMData): 14 (JSC::JSRunLoopTimer::Manager::timerDidFire): 15 (JSC::JSRunLoopTimer::Manager::registerVM): 16 (JSC::JSRunLoopTimer::Manager::scheduleTimer): 17 (JSC::JSRunLoopTimer::Manager::cancelTimer): 18 (JSC::JSRunLoopTimer::Manager::didChangeRunLoop): 19 * runtime/JSRunLoopTimer.h: 20 (JSC::JSRunLoopTimer::Manager::PerVMData::PerVMData): 21 * runtime/PromiseTimer.cpp: 22 (JSC::PromiseTimer::doWork): 23 (JSC::PromiseTimer::runRunLoop): 24 * runtime/VM.cpp: 25 (JSC::VM::VM): 26 (JSC::VM::create): 27 (JSC::VM::tryCreate): 28 (JSC::VM::setRunLoop): 29 * runtime/VM.h: 30 (JSC::VM::runLoop const): 31 1 32 2020-07-20 Ross Kirsling <ross.kirsling@sony.com> 2 33 -
trunk/Source/JavaScriptCore/runtime/DeferredWorkTimer.cpp
r264617 r264635 82 82 } 83 83 84 if (m_pendingTickets.isEmpty() && m_shouldStopRunLoopWhenAllTicketsFinish) 84 if (m_pendingTickets.isEmpty() && m_shouldStopRunLoopWhenAllTicketsFinish) { 85 #if USE(CF) 86 CFRunLoopStop(vm.runLoop()); 87 #else 85 88 RunLoop::current().stop(); 89 #endif 90 } 86 91 87 92 m_taskLock.unlock(); … … 91 96 { 92 97 ASSERT(!m_apiLock->vm()->currentThreadIsHoldingAPILock()); 93 ASSERT(&RunLoop::current() == &m_apiLock->vm()->runLoop()); 98 #if USE(CF) 99 ASSERT(CFRunLoopGetCurrent() == m_apiLock->vm()->runLoop()); 100 #endif 94 101 m_shouldStopRunLoopWhenAllTicketsFinish = true; 95 if (m_pendingTickets.size()) 102 if (m_pendingTickets.size()) { 103 #if USE(CF) 104 CFRunLoopRun(); 105 #else 96 106 RunLoop::run(); 107 #endif 108 } 97 109 } 98 110 -
trunk/Source/JavaScriptCore/runtime/JSRunLoopTimer.cpp
r264315 r264635 41 41 static inline JSRunLoopTimer::Manager::EpochTime epochTime(Seconds delay) 42 42 { 43 #if USE(CF) 44 return Seconds { CFAbsoluteTimeGetCurrent() + delay.value() }; 45 #else 43 46 return MonotonicTime::now().secondsSinceEpoch() + delay; 44 } 45 46 JSRunLoopTimer::Manager::PerVMData::PerVMData(Manager& manager, RunLoop& runLoop) 47 : runLoop(runLoop) 48 , timer(makeUnique<RunLoop::Timer<Manager>>(runLoop, &manager, &JSRunLoopTimer::Manager::timerDidFireCallback)) 47 #endif 48 } 49 50 #if USE(CF) 51 void JSRunLoopTimer::Manager::timerDidFireCallback(CFRunLoopTimerRef, void* contextPtr) 52 { 53 static_cast<JSRunLoopTimer::Manager*>(contextPtr)->timerDidFire(); 54 } 55 56 void JSRunLoopTimer::Manager::PerVMData::setRunLoop(Manager* manager, CFRunLoopRef newRunLoop) 57 { 58 if (runLoop) { 59 CFRunLoopRemoveTimer(runLoop.get(), timer.get(), kCFRunLoopCommonModes); 60 CFRunLoopTimerInvalidate(timer.get()); 61 runLoop.clear(); 62 timer.clear(); 63 } 64 65 if (newRunLoop) { 66 runLoop = newRunLoop; 67 memset(&context, 0, sizeof(CFRunLoopTimerContext)); 68 RELEASE_ASSERT(manager); 69 context.info = manager; 70 timer = adoptCF(CFRunLoopTimerCreate(kCFAllocatorDefault, CFAbsoluteTimeGetCurrent() + s_decade.seconds(), CFAbsoluteTimeGetCurrent() + s_decade.seconds(), 0, 0, JSRunLoopTimer::Manager::timerDidFireCallback, &context)); 71 CFRunLoopAddTimer(runLoop.get(), timer.get(), kCFRunLoopCommonModes); 72 73 EpochTime scheduleTime = epochTime(s_decade); 74 for (auto& pair : timers) 75 scheduleTime = std::min(pair.second, scheduleTime); 76 CFRunLoopTimerSetNextFireDate(timer.get(), scheduleTime.value()); 77 } 78 } 79 #else 80 JSRunLoopTimer::Manager::PerVMData::PerVMData(Manager& manager) 81 : runLoop(&RunLoop::current()) 82 , timer(makeUnique<RunLoop::Timer<Manager>>(*runLoop, &manager, &JSRunLoopTimer::Manager::timerDidFireCallback)) 49 83 { 50 84 #if USE(GLIB_EVENT_LOOP) … … 58 92 timerDidFire(); 59 93 } 94 #endif 60 95 61 96 JSRunLoopTimer::Manager::PerVMData::~PerVMData() 62 97 { 98 #if USE(CF) 99 setRunLoop(nullptr, nullptr); 100 #endif 63 101 } 64 102 … … 69 107 { 70 108 auto locker = holdLock(m_lock); 109 #if USE(CF) 110 CFRunLoopRef currentRunLoop = CFRunLoopGetCurrent(); 111 #else 71 112 RunLoop* currentRunLoop = &RunLoop::current(); 113 #endif 72 114 EpochTime nowEpochTime = epochTime(0_s); 73 115 for (auto& entry : m_mapping) { 74 116 PerVMData& data = *entry.value; 75 if (data.runLoop.ptr() != currentRunLoop) 117 #if USE(CF) 118 if (data.runLoop.get() != currentRunLoop) 76 119 continue; 120 #else 121 if (data.runLoop != currentRunLoop) 122 continue; 123 #endif 77 124 78 125 EpochTime scheduleTime = epochTime(s_decade); … … 94 141 } 95 142 143 #if USE(CF) 144 CFRunLoopTimerSetNextFireDate(data.timer.get(), scheduleTime.value()); 145 #else 96 146 data.timer->startOneShot(std::max(0_s, scheduleTime - MonotonicTime::now().secondsSinceEpoch())); 147 #endif 97 148 } 98 149 } … … 114 165 void JSRunLoopTimer::Manager::registerVM(VM& vm) 115 166 { 116 auto data = makeUnique<PerVMData>(*this, vm.runLoop()); 167 auto data = makeUnique<PerVMData>(*this); 168 #if USE(CF) 169 data->setRunLoop(this, vm.runLoop()); 170 #endif 117 171 118 172 auto locker = holdLock(m_lock); … … 152 206 data.timers.append({ timer, fireEpochTime }); 153 207 208 #if USE(CF) 209 CFRunLoopTimerSetNextFireDate(data.timer.get(), scheduleTime.value()); 210 #else 154 211 data.timer->startOneShot(std::max(0_s, scheduleTime - MonotonicTime::now().secondsSinceEpoch())); 212 #endif 155 213 } 156 214 … … 183 241 } 184 242 243 #if USE(CF) 244 CFRunLoopTimerSetNextFireDate(data.timer.get(), scheduleTime.value()); 245 #else 185 246 data.timer->startOneShot(std::max(0_s, scheduleTime - MonotonicTime::now().secondsSinceEpoch())); 247 #endif 186 248 } 187 249 … … 202 264 return WTF::nullopt; 203 265 } 266 267 #if USE(CF) 268 void JSRunLoopTimer::Manager::didChangeRunLoop(VM& vm, CFRunLoopRef newRunLoop) 269 { 270 auto locker = holdLock(m_lock); 271 auto iter = m_mapping.find({ vm.apiLock() }); 272 RELEASE_ASSERT(iter != m_mapping.end()); 273 274 PerVMData& data = *iter->value; 275 data.setRunLoop(this, newRunLoop); 276 } 277 #endif 204 278 205 279 void JSRunLoopTimer::timerDidFire() -
trunk/Source/JavaScriptCore/runtime/JSRunLoopTimer.h
r264315 r264635 34 34 #include <wtf/ThreadSafeRefCounted.h> 35 35 36 #if USE(CF) 37 #include <CoreFoundation/CoreFoundation.h> 38 #endif 39 36 40 namespace JSC { 37 41 … … 47 51 WTF_MAKE_FAST_ALLOCATED; 48 52 WTF_MAKE_NONCOPYABLE(Manager); 53 #if USE(CF) 54 static void timerDidFireCallback(CFRunLoopTimerRef, void*); 55 #else 49 56 void timerDidFireCallback(); 50 57 #endif 51 58 Manager() = default; 52 59 … … 64 71 Optional<Seconds> timeUntilFire(JSRunLoopTimer&); 65 72 73 #if USE(CF) 74 void didChangeRunLoop(VM&, CFRunLoopRef newRunLoop); 75 #endif 76 66 77 private: 67 78 Lock m_lock; … … 71 82 WTF_MAKE_NONCOPYABLE(PerVMData); 72 83 public: 73 PerVMData(Manager&, WTF::RunLoop&); 84 #if USE(CF) 85 PerVMData(Manager&) { } 86 #else 87 PerVMData(Manager&); 88 #endif 74 89 ~PerVMData(); 75 90 76 Ref<WTF::RunLoop> runLoop; 91 #if USE(CF) 92 void setRunLoop(Manager*, CFRunLoopRef); 93 RetainPtr<CFRunLoopTimerRef> timer; 94 RetainPtr<CFRunLoopRef> runLoop; 95 CFRunLoopTimerContext context; 96 #else 97 RunLoop* runLoop; 77 98 std::unique_ptr<RunLoop::Timer<Manager>> timer; 99 #endif 78 100 Vector<std::pair<Ref<JSRunLoopTimer>, EpochTime>> timers; 79 101 }; -
trunk/Source/JavaScriptCore/runtime/VM.cpp
r264617 r264635 264 264 static bool vmCreationShouldCrash = false; 265 265 266 VM::VM(VMType vmType, HeapType heapType, WTF::RunLoop* runLoop,bool* success)266 VM::VM(VMType vmType, HeapType heapType, bool* success) 267 267 : m_id(nextID()) 268 268 , m_apiLock(adoptRef(new JSLock(this))) 269 , m_runLoop(runLoop ? *runLoop : WTF::RunLoop::current()) 269 #if USE(CF) 270 , m_runLoop(CFRunLoopGetCurrent()) 271 #endif // USE(CF) 270 272 , m_random(Options::seedOfVMRandomForFuzzer() ? Options::seedOfVMRandomForFuzzer() : cryptographicallyRandomNumber()) 271 273 , m_integrityRandom(*this) … … 678 680 } 679 681 680 Ref<VM> VM::create(HeapType heapType , WTF::RunLoop* runLoop)681 { 682 return adoptRef(*new VM(Default, heapType , runLoop));683 } 684 685 RefPtr<VM> VM::tryCreate(HeapType heapType , WTF::RunLoop* runLoop)682 Ref<VM> VM::create(HeapType heapType) 683 { 684 return adoptRef(*new VM(Default, heapType)); 685 } 686 687 RefPtr<VM> VM::tryCreate(HeapType heapType) 686 688 { 687 689 bool success = true; 688 RefPtr<VM> vm = adoptRef(new VM(Default, heapType, runLoop,&success));690 RefPtr<VM> vm = adoptRef(new VM(Default, heapType, &success)); 689 691 if (!success) { 690 692 // Here, we're destructing a partially constructed VM and we know that … … 1383 1385 } 1384 1386 #endif 1387 1388 #if USE(CF) 1389 void VM::setRunLoop(CFRunLoopRef runLoop) 1390 { 1391 ASSERT(runLoop); 1392 m_runLoop = runLoop; 1393 JSRunLoopTimer::Manager::shared().didChangeRunLoop(*this, runLoop); 1394 } 1395 #endif // USE(CF) 1385 1396 1386 1397 ScratchBuffer* VM::scratchBufferForSize(size_t size) -
trunk/Source/JavaScriptCore/runtime/VM.h
r264617 r264635 95 95 96 96 namespace WTF { 97 class RunLoop;98 97 class SimpleStats; 99 98 } // namespace WTF … … 314 313 JS_EXPORT_PRIVATE static VM& sharedInstance(); 315 314 316 JS_EXPORT_PRIVATE static Ref<VM> create(HeapType = SmallHeap , WTF::RunLoop* = nullptr);317 JS_EXPORT_PRIVATE static RefPtr<VM> tryCreate(HeapType = SmallHeap , WTF::RunLoop* = nullptr);315 JS_EXPORT_PRIVATE static Ref<VM> create(HeapType = SmallHeap); 316 JS_EXPORT_PRIVATE static RefPtr<VM> tryCreate(HeapType = SmallHeap); 318 317 static Ref<VM> createContextGroup(HeapType = SmallHeap); 319 318 JS_EXPORT_PRIVATE ~VM(); … … 356 355 unsigned m_id; 357 356 RefPtr<JSLock> m_apiLock; 358 Ref<WTF::RunLoop> m_runLoop; 357 #if USE(CF) 358 // These need to be initialized before heap below. 359 RetainPtr<CFRunLoopRef> m_runLoop; 360 #endif 359 361 360 362 WeakRandom m_random; … … 1081 1083 #endif 1082 1084 1083 WTF::RunLoop& runLoop() const { return m_runLoop; } 1085 #if USE(CF) 1086 CFRunLoopRef runLoop() const { return m_runLoop.get(); } 1087 JS_EXPORT_PRIVATE void setRunLoop(CFRunLoopRef); 1088 #endif // USE(CF) 1084 1089 1085 1090 static void setCrashOnVMCreation(bool); … … 1105 1110 friend class LLIntOffsetsExtractor; 1106 1111 1107 VM(VMType, HeapType, WTF::RunLoop* = nullptr,bool* success = nullptr);1112 VM(VMType, HeapType, bool* success = nullptr); 1108 1113 static VM*& sharedInstanceInternal(); 1109 1114 void createNativeThunk(); -
trunk/Source/WebCore/ChangeLog
r264630 r264635 1 2020-07-20 Geoffrey Garen <ggaren@apple.com> 2 3 REGRESSION (r264242): [ macOS ] imported/w3c/web-platform-tests/wasm/jsapi/constructor/instantiate.any.html is a flaky crash 4 https://bugs.webkit.org/show_bug.cgi?id=214572 5 6 Unreviewed, reverting r264242. 7 8 * bindings/js/CommonVM.cpp: 9 (WebCore::commonVMSlow): 10 1 11 2020-07-20 Adrian Perez de Castro <aperez@igalia.com> 2 12 -
trunk/Source/WebCore/bindings/js/CommonVM.cpp
r264333 r264635 57 57 ScriptController::initializeMainThread(); 58 58 59 RunLoop* runLoop = nullptr; 60 #if PLATFORM(IOS_FAMILY) 61 if (RunLoop* web = RunLoop::webIfExists()) 62 runLoop = web; 63 #endif 64 65 auto& vm = JSC::VM::create(JSC::LargeHeap, runLoop).leakRef(); 59 auto& vm = JSC::VM::create(JSC::LargeHeap).leakRef(); 66 60 67 61 g_commonVMOrNull = &vm; … … 72 66 if (WebThreadIsEnabled()) 73 67 vm.apiLock().makeWebThreadAware(); 68 vm.setRunLoop(WebThreadRunLoop()); 74 69 vm.heap.machineThreads().addCurrentThread(); 75 70 #endif
Note:
See TracChangeset
for help on using the changeset viewer.