void TraceEventDispatcher::removeAllListeners(TraceEventTargetBase* instance, InspectorClient* client)
{
    ASSERT(isMainThread());
    processBackgroundEvents();
    {
        MutexLocker locker(m_mutex);

        HandlersMap remainingHandlers;
        for (HandlersMap::iterator it = m_handlers.begin(); it != m_handlers.end(); ++it) {
            Vector<BoundTraceEventHandler>& handlers = it->value;
            for (size_t j = 0; j < handlers.size();) {
                if (handlers[j].instance == instance)
                    handlers.remove(j);
                else
                    ++j;
            }
            if (!handlers.isEmpty())
                remainingHandlers.add(it->key, it->value);
        }
        m_handlers.swap(remainingHandlers);
    }
    if (m_handlers.isEmpty())
        client->setTraceEventCallback(0);
}
void TraceEventDispatcher::removeAllListeners(void* eventTarget, InspectorClient* client)
{
    ASSERT(isMainThread());
    processBackgroundEvents();
    {
        MutexLocker locker(m_mutex);

        ListenersMap remainingListeners;
        for (ListenersMap::iterator it = m_listeners->begin(); it != m_listeners->end(); ++it) {
            WillBeHeapVector<OwnPtrWillBeMember<TraceEventListener> >& listeners = *it->value.get();
            for (size_t j = 0; j < listeners.size();) {
                if (listeners[j]->target() == eventTarget)
                    listeners.remove(j);
                else
                    ++j;
            }
            if (!listeners.isEmpty())
                remainingListeners.add(it->key, it->value.release());
        }
        m_listeners->swap(remainingListeners);
    }
    if (m_listeners->isEmpty())
        client->resetTraceEventCallback();
}
void TraceEventDispatcher::processBackgroundEventsTask()
{
    m_processEventsTaskInFlight = false;
    processBackgroundEvents();
}