Changeset 103556 in webkit


Ignore:
Timestamp:
Dec 22, 2011 10:38:08 AM (12 years ago)
Author:
kling@webkit.org
Message:

SnowLeopard crashes due to thread-unsafe EventListenerIterator ASSERTs
<http://webkit.org/b/74260>

Reviewed by Darin Adler.

Guard EventListenerMap::m_activeIteratorCount with a mutex.

  • dom/EventListenerMap.cpp:

(WebCore::activeIteratorCountMutex):
(WebCore::EventListenerMap::assertNoActiveIterators):
(WebCore::EventListenerMap::clear):
(WebCore::EventListenerMap::add):
(WebCore::EventListenerMap::remove):
(WebCore::EventListenerMap::find):
(WebCore::EventListenerMap::removeFirstEventListenerCreatedFromMarkup):
(WebCore::EventListenerMap::copyEventListenersNotCreatedFromMarkupToTarget):
(WebCore::EventListenerIterator::EventListenerIterator):
(WebCore::EventListenerIterator::~EventListenerIterator):

  • dom/EventListenerMap.h:

(WebCore::EventListenerMap::assertNoActiveIterators):

Location:
trunk/Source/WebCore
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/ChangeLog

    r103555 r103556  
     12011-12-22  Andreas Kling  <kling@webkit.org>
     2
     3        SnowLeopard crashes due to thread-unsafe EventListenerIterator ASSERTs
     4        <http://webkit.org/b/74260>
     5
     6        Reviewed by Darin Adler.
     7
     8        Guard EventListenerMap::m_activeIteratorCount with a mutex.
     9
     10        * dom/EventListenerMap.cpp:
     11        (WebCore::activeIteratorCountMutex):
     12        (WebCore::EventListenerMap::assertNoActiveIterators):
     13        (WebCore::EventListenerMap::clear):
     14        (WebCore::EventListenerMap::add):
     15        (WebCore::EventListenerMap::remove):
     16        (WebCore::EventListenerMap::find):
     17        (WebCore::EventListenerMap::removeFirstEventListenerCreatedFromMarkup):
     18        (WebCore::EventListenerMap::copyEventListenersNotCreatedFromMarkupToTarget):
     19        (WebCore::EventListenerIterator::EventListenerIterator):
     20        (WebCore::EventListenerIterator::~EventListenerIterator):
     21        * dom/EventListenerMap.h:
     22        (WebCore::EventListenerMap::assertNoActiveIterators):
     23
    1242011-12-22  Vsevolod Vlasov  <vsevik@chromium.org>
    225
  • trunk/Source/WebCore/dom/EventListenerMap.cpp

    r102349 r103556  
    4040#include <wtf/Vector.h>
    4141
     42#ifndef NDEBUG
     43#include <wtf/Threading.h>
     44#endif
     45
    4246using namespace WTF;
    4347
    4448namespace WebCore {
     49
     50#ifndef NDEBUG
     51static Mutex& activeIteratorCountMutex()
     52{
     53    DEFINE_STATIC_LOCAL(Mutex, mutex, ());
     54    return mutex;
     55}
     56
     57void EventListenerMap::assertNoActiveIterators()
     58{
     59    MutexLocker locker(activeIteratorCountMutex());
     60    ASSERT(!m_activeIteratorCount);
     61}
     62#endif
    4563
    4664EventListenerMap::EventListenerMap()
     
    6785void EventListenerMap::clear()
    6886{
    69     ASSERT(!m_activeIteratorCount);
     87    assertNoActiveIterators();
    7088
    7189    if (m_hashMap)
     
    105123bool EventListenerMap::add(const AtomicString& eventType, PassRefPtr<EventListener> listener, bool useCapture)
    106124{
    107     ASSERT(!m_activeIteratorCount);
     125    assertNoActiveIterators();
    108126
    109127    if (m_singleEventListenerVector && m_singleEventListenerType != eventType) {
     
    145163bool EventListenerMap::remove(const AtomicString& eventType, EventListener* listener, bool useCapture, size_t& indexOfRemovedListener)
    146164{
    147     ASSERT(!m_activeIteratorCount);
     165    assertNoActiveIterators();
    148166
    149167    if (!m_hashMap) {
     
    170188EventListenerVector* EventListenerMap::find(const AtomicString& eventType)
    171189{
    172     ASSERT(!m_activeIteratorCount);
     190    assertNoActiveIterators();
    173191
    174192    if (m_hashMap) {
     
    204222void EventListenerMap::removeFirstEventListenerCreatedFromMarkup(const AtomicString& eventType)
    205223{
    206     ASSERT(!m_activeIteratorCount);
     224    assertNoActiveIterators();
    207225
    208226    if (m_hashMap) {
     
    243261void EventListenerMap::copyEventListenersNotCreatedFromMarkupToTarget(EventTarget* target)
    244262{
    245     ASSERT(!m_activeIteratorCount);
     263    assertNoActiveIterators();
    246264
    247265    if (m_hashMap) {
     
    279297
    280298#ifndef NDEBUG
    281     m_map->m_activeIteratorCount++;
     299    {
     300        MutexLocker locker(activeIteratorCountMutex());
     301        m_map->m_activeIteratorCount++;
     302    }
    282303#endif
    283304
     
    291312EventListenerIterator::~EventListenerIterator()
    292313{
    293     if (m_map)
     314    if (m_map) {
     315        MutexLocker locker(activeIteratorCountMutex());
    294316        m_map->m_activeIteratorCount--;
     317    }
    295318}
    296319#endif
  • trunk/Source/WebCore/dom/EventListenerMap.h

    r102349 r103556  
    6666    friend class EventListenerIterator;
    6767
     68    void assertNoActiveIterators();
     69
    6870    struct EventListenerHashMapTraits : HashTraits<WTF::AtomicString> {
    6971        static const int minimumTableSize = 32;
     
    99101};
    100102
     103#ifdef NDEBUG
     104inline void EventListenerMap::assertNoActiveIterators() { }
     105#endif
     106
    101107} // namespace WebCore
    102108
Note: See TracChangeset for help on using the changeset viewer.