RunExpiredTimeouts has "fudging" code to always ensure that we execute at least one timeout. This is intended to cover cases where an nsITimer fires slightly early, but it means we must be careful not to fire a timer more times than we intend to or we'll execute a timeout prematurely.
Consider a sequences of setTimeout calls alternating in delay between 0ms and 1000ms. When the 1000ms timeout fires, it schedules a 0ms timeout. The setTimeout call itself calls RescheduleTimeoutTimer, which schedules the timer for a 0 ms delay. And once we unwind the 1000ms timeout RunExpiredTimeouts will also schedule the timer for a 0 ms delay. If the timer has fired (remember, it's processed on a completely different thread) in the meantime, we ultimately will get two callbacks from nsITimer for our 0 ms timeout. The first will run the 0 ms timeout and schedule a 1000 ms timeout, and the second will run the 1000 ms timeout (remember, RunExpiredTimeouts always runs at least one timeout!) ~999 ms ahead of schedule.
The solution is to cancel the timer in RescheduleTimeoutTimer, so that when we call it the second time it will cause any pending events from the first scheduling to be canceled. But this actually doesn't work at all, because of how we use nsITimer. Before worker threads were capable of accepting arbitrary runnables we created TimerThreadEventTarget, which translates the timer firing to the special worker event queue when the timer thread attempts to *dispatch* a runnable to the worker. We still need this for some of the other types of timers (which use control runnables that interrupt JS, and not the regular event queue). But setTimeout can simply run like a normal nsITimer callback now. We need that here, or calling nsITimer::Cancel won't actually do anything, because the timer's event was ignored and TimerThreadEventTarget created its own event.
Initialize GMPStorage::mShutdown to true, so that if Init() has not completed
yet or if it failed, other methods will not try and access a null mStorage.
dom/media/ADTSDemuxer.cpp:481:10 [-Wclass-varargs] passing object of class type 'const media::TimeUnit' through variadic function
dom/media/ADTSDemuxer.cpp:513:11 [-Wclass-varargs] passing object of class type 'const media::TimeUnit' through variadic function
dom/media/ADTSDemuxer.cpp:526:14 [-Wclass-varargs] passing object of class type 'const media::TimeUnit' through variadic function
dom/media/ADTSDemuxer.cpp:527:23 [-Wclass-varargs] passing object of class type 'media::TimeUnit' through variadic function
dom/media/ADTSDemuxer.cpp:532:11 [-Wclass-varargs] passing object of class type 'const media::TimeUnit' through variadic function
dom/media/MP3Demuxer.cpp:201:10 [-Wclass-varargs] passing object of class type 'const mozilla::media::TimeUnit' through variadic function
dom/media/MP3Demuxer.cpp:237:10 [-Wclass-varargs] passing object of class type 'const mozilla::media::TimeUnit' through variadic function
dom/media/MP3Demuxer.cpp:256:13 [-Wclass-varargs] passing object of class type 'const mozilla::media::TimeUnit' through variadic function
dom/media/MP3Demuxer.cpp:257:22 [-Wclass-varargs] passing object of class type 'media::TimeUnit' through variadic function
dom/media/MP3Demuxer.cpp:262:10 [-Wclass-varargs] passing object of class type 'const mozilla::media::TimeUnit' through variadic function
Bluetooth's UUID arrays are sorted and stripped from duplicates. This code is
now executed in the client process. This reduces the amount of privilegued
code and accounts the required computation time to the process that actually
uses it.
The change also makes the IPDL interface a bit less fragile, as the client
does not expect sorted arrays from the chrome process. It's a detail of the
client's implementation that manifested itself in the interface.
We use the same logic as what is used in libvpx to ensure that we won't get a regression due to excessive memory/thread use when replacing libvpx with ffmpeg.
This patch replaces Bluetooth's internal implmentation for starting
bluetoothd with the portable one provided by the HAL module. Gonk-
specific workarounds are preserved within HAL.