As part of removing thread-safe refcounting from tasks, it makes sense to add the method on MessageQueue that would remove specified set of tasksk from the queue. Otherwise, this operation is done by removing tasksk from the queue and then re-inserting them back, which is longer, results in more locking operations and doesn't help bug 30612.
Created attachment 42047 [details] Proposed patch.
Comment on attachment 42047 [details] Proposed patch. Just a few nits. Please fix and submit. > diff --git a/JavaScriptCore/wtf/MessageQueue.h b/JavaScriptCore/wtf/MessageQueue.h > + void removeWithPredicate(Predicate&); Consider using "removeIf" instead of "removeWithPredicate" (It is similar in naming to the findIf method on Deque). > + inline void MessageQueue<DataType>::removeWithPredicate(Predicate& predicate) > + { > + MutexLocker lock(m_mutex); > + DequeConstIterator<DataType> found = m_queue.end(); > + while ((found = m_queue.findIf(predicate)) != m_queue.end()) { > + m_queue.remove(found); ASSERT(0); Please remove "ASSERT(0);" > diff --git a/WebCore/ChangeLog b/WebCore/ChangeLog > + (WebCore::SameDatabasePredicate::SameDatabasePredicate): Added predicate that flags the tasks belonging to specified database. Consider: to "a" specified database. > + (WebCore::DatabaseThread::unscheduleDatabaseTasks): changed to use new removeWithPredicate method. Consider: use "the" new removeWithPredicate
Fixed all and landed: http://trac.webkit.org/changeset/50247