With WebCore SQL logging enabled, open <http://bugs.webkit.org/attachment.cgi?id=18455>. It runs without assertion failures now, but after a while, it just stops (it doesn't freeze Safari, but no more SQL requests are being served).
The database thread loop looks like this: while (!m_terminationRequested) { m_threadMutex.unlock(); AutodrainedPool pool; LOG(StorageAPI, "Iteration of main loop for DatabaseThread %p", this); bool result; do { result = dispatchNextTaskIdentifier(); if (m_terminationRequested) break; } while(result); if (m_terminationRequested) break; pool.cycle(); m_threadMutex.lock(); m_threadCondition.wait(m_threadMutex); } It's pretty clear how the wakeup is lost - if a new task is dispatched after the inner loop has decided that it has nothing else to do, but before we're stopped on the condition, the condition is signaled in vain.
<rdar://problem/5729619>
Fixed in <http://trac.webkit.org/projects/webkit/changeset/30172>.