| Index: Source/core/inspector/TraceEventDispatcher.cpp
|
| diff --git a/Source/core/inspector/TraceEventDispatcher.cpp b/Source/core/inspector/TraceEventDispatcher.cpp
|
| index 5d17d2f7789c078ef186d2517358a3172cacddb9..110cbcbbcf1432443563fe458bf7417985952b25 100644
|
| --- a/Source/core/inspector/TraceEventDispatcher.cpp
|
| +++ b/Source/core/inspector/TraceEventDispatcher.cpp
|
| @@ -46,7 +46,7 @@ void TraceEventDispatcher::dispatchEventOnAnyThread(char phase, const unsigned c
|
| TraceEventDispatcher* self = instance();
|
| {
|
| MutexLocker locker(self->m_mutex);
|
| - if (self->m_handlers.find(std::make_pair(name, phase)) == self->m_handlers.end())
|
| + if (self->m_listeners->find(std::make_pair(name, phase)) == self->m_listeners->end())
|
| return;
|
| }
|
| self->enqueueEvent(TraceEvent(timestamp, phase, name, id, currentThread(), numArgs, argNames, argTypes, argValues));
|
| @@ -87,52 +87,52 @@ void TraceEventDispatcher::processBackgroundEvents()
|
| }
|
| for (size_t eventIndex = 0, size = events.size(); eventIndex < size; ++eventIndex) {
|
| const TraceEvent& event = events[eventIndex];
|
| - HandlersMap::iterator it = m_handlers.find(std::make_pair(event.name(), event.phase()));
|
| - if (it == m_handlers.end())
|
| + ListenersMap::iterator it = m_listeners->find(std::make_pair(event.name(), event.phase()));
|
| + if (it == m_listeners->end())
|
| continue;
|
| - Vector<BoundTraceEventHandler>& handlers = it->value;
|
| - for (size_t handlerIndex = 0; handlerIndex < handlers.size(); ++handlerIndex)
|
| - (handlers[handlerIndex].instance->*(handlers[handlerIndex].method))(event);
|
| + WillBeHeapVector<OwnPtrWillBeMember<TraceEventListener> >& listeners = *it->value.get();
|
| + for (size_t listenerIndex = 0; listenerIndex < listeners.size(); ++listenerIndex)
|
| + listeners[listenerIndex]->call(event);
|
| }
|
| }
|
|
|
| -void TraceEventDispatcher::innerAddListener(const char* name, char phase, TraceEventTargetBase* instance, TraceEventHandlerMethod method, InspectorClient* client)
|
| +void TraceEventDispatcher::addListener(const char* name, char phase, PassOwnPtrWillBeRawPtr<TraceEventListener> listener, InspectorClient* client)
|
| {
|
| static const char CategoryFilter[] = "-*," TRACE_DISABLED_BY_DEFAULT("devtools.timeline") "," TRACE_DISABLED_BY_DEFAULT("devtools.timeline.frame");
|
|
|
| ASSERT(isMainThread());
|
| MutexLocker locker(m_mutex);
|
| - if (m_handlers.isEmpty())
|
| + if (m_listeners->isEmpty())
|
| client->setTraceEventCallback(CategoryFilter, dispatchEventOnAnyThread);
|
| - HandlersMap::iterator it = m_handlers.find(std::make_pair(name, phase));
|
| - if (it == m_handlers.end())
|
| - m_handlers.add(std::make_pair(name, phase), Vector<BoundTraceEventHandler>()).storedValue->value.append(BoundTraceEventHandler(instance, method));
|
| + ListenersMap::iterator it = m_listeners->find(std::make_pair(name, phase));
|
| + if (it == m_listeners->end())
|
| + m_listeners->add(std::make_pair(name, phase), adoptPtrWillBeNoop(new WillBeHeapVector<OwnPtrWillBeMember<TraceEventListener> >())).storedValue->value->append(listener);
|
| else
|
| - it->value.append(BoundTraceEventHandler(instance, method));
|
| + it->value->append(listener);
|
| }
|
|
|
| -void TraceEventDispatcher::removeAllListeners(TraceEventTargetBase* instance, InspectorClient* client)
|
| +void TraceEventDispatcher::removeAllListeners(void* eventTarget, 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);
|
| + 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 (!handlers.isEmpty())
|
| - remainingHandlers.add(it->key, it->value);
|
| + if (!listeners.isEmpty())
|
| + remainingListeners.add(it->key, it->value.release());
|
| }
|
| - m_handlers.swap(remainingHandlers);
|
| + m_listeners->swap(remainingListeners);
|
| }
|
| - if (m_handlers.isEmpty())
|
| + if (m_listeners->isEmpty())
|
| client->resetTraceEventCallback();
|
| }
|
|
|
|
|