It's possible for RunLoop::performWork() to return without handling all the functions in the queue. In that case, CF is going to unset the CFRunLoopSource "signaled" state, which means that source won't get processed again until RunLoop::dispatch is called. We should re-signal the source at the end of RunLoop::performWork() if there's still work to do. This is OK, because CF unsets the signaled bit before it calls us. Also, RunLoop::dispatch() should drop the mutex before calling wakeUp().
Never mind. If something was added to the m_functionQueue inside of RunLoop::performWork(), it would have had to have been via RunLoop::dispatch, which would have signaled. So I'll just keep this for the mutex fix.
Created attachment 246931 [details] Patch
Comment on attachment 246931 [details] Patch Clearing flags on attachment: 246931 Committed r180434: <http://trac.webkit.org/changeset/180434>
All reviewed patches have been landed. Closing bug.