Changeset 116969 in webkit


Ignore:
Timestamp:
May 14, 2012 11:04:17 AM (12 years ago)
Author:
kling@webkit.org
Message:

REGRESSION(r116796): Assertion failure in API tests
<http://webkit.org/b/86378>
<rdar://problem/10777218>

Reviewed by Anders Carlsson.

Invalidate the plugin work queue in ~WebContext to avoid hitting
the !m_isValid assertion in ~WorkQueue later on.

  • UIProcess/WebContext.cpp:

(WebKit::WebContext::~WebContext):

Location:
trunk/Source
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/Source/WebCore/loader/icon/IconDatabase.cpp

    r116198 r116969  
    223223
    224224    MutexLocker locker(m_urlAndIconLock);
     225
     226    if (m_retainOrReleaseIconRequested)
     227        performPendingRetainAndReleaseOperations();
    225228   
    226229    String pageURLCopy; // Creates a null string for easy testing
     
    390393}
    391394
    392 
    393 void IconDatabase::retainIconForPageURL(const String& pageURLOriginal)
    394 {   
     395void IconDatabase::retainIconForPageURL(const String& pageURL)
     396{
    395397    ASSERT_NOT_SYNC_THREAD();
    396    
    397     // Cannot do anything with pageURLOriginal that would end up storing it without deep copying first
    398    
    399     if (!isEnabled() || !documentCanHaveIcon(pageURLOriginal))
     398
     399    if (!isEnabled() || !documentCanHaveIcon(pageURL))
    400400        return;
    401401       
    402     MutexLocker locker(m_urlAndIconLock);
    403 
     402    MutexLocker locker(m_urlsToRetainOrReleaseLock);
     403    m_urlsToRetain.append(pageURL);
     404    scheduleOrDeferSyncTimer();
     405}
     406
     407void IconDatabase::performRetainIconForPageURL(const String& pageURLOriginal)
     408{
    404409    PageURLRecord* record = m_pageURLToRecordMap.get(pageURLOriginal);
    405410   
     
    435440}
    436441
    437 void IconDatabase::releaseIconForPageURL(const String& pageURLOriginal)
     442void IconDatabase::releaseIconForPageURL(const String& pageURL)
    438443{
    439444    ASSERT_NOT_SYNC_THREAD();
     
    441446    // Cannot do anything with pageURLOriginal that would end up storing it without deep copying first
    442447   
    443     if (!isEnabled() || !documentCanHaveIcon(pageURLOriginal))
    444         return;
    445    
    446     MutexLocker locker(m_urlAndIconLock);
    447 
     448    if (!isEnabled() || !documentCanHaveIcon(pageURL))
     449        return;
     450
     451    MutexLocker locker(m_urlsToRetainOrReleaseLock);
     452    m_urlsToRelease.append(pageURL);
     453    m_retainOrReleaseIconRequested = true;
     454    scheduleOrDeferSyncTimer();
     455}
     456
     457void IconDatabase::performReleaseIconForPageURL(const String& pageURLOriginal)
     458{
    448459    // Check if this pageURL is actually retained
    449460    if (!m_retainedPageURLs.contains(pageURLOriginal)) {
     
    499510   
    500511    delete pageRecord;
    501 
    502     if (isOpen())
    503         scheduleOrDeferSyncTimer();
    504512}
    505513
     
    737745{
    738746    MutexLocker locker(m_urlAndIconLock);
     747
     748    if (m_retainOrReleaseIconRequested)
     749        performPendingRetainAndReleaseOperations();
     750
    739751    return m_retainedPageURLs.size();
    740752}
     
    13071319    {
    13081320        MutexLocker locker(m_urlAndIconLock);
    1309        
     1321
     1322        if (m_retainOrReleaseIconRequested)
     1323            performPendingRetainAndReleaseOperations();
     1324
    13101325        for (unsigned i = 0; i < urls.size(); ++i) {
    13111326            if (!m_retainedPageURLs.contains(urls[i])) {
     
    13881403        if (m_threadTerminationRequested)
    13891404            break;
     1405
     1406        if (m_retainOrReleaseIconRequested) {
     1407            MutexLocker locker(m_urlAndIconLock);
     1408            performPendingRetainAndReleaseOperations();
     1409        }
    13901410       
    13911411        bool didAnyWork = true;
     
    14701490        m_disabledSuddenTerminationForSyncThread = false;
    14711491    }
     1492}
     1493
     1494void IconDatabase::performPendingRetainAndReleaseOperations()
     1495{
     1496    ASSERT(m_retainOrReleaseIconRequested);
     1497
     1498    // NOTE: The caller is assumed to hold m_urlAndIconLock.
     1499
     1500    MutexLocker vectorLocker(m_urlsToRetainOrReleaseLock);
     1501
     1502    for (unsigned i = 0; i < m_urlsToRetain.size(); ++i)
     1503        performRetainIconForPageURL(m_urlsToRetain[i]);
     1504    for (unsigned i = 0; i < m_urlsToRelease.size(); ++i)
     1505        performReleaseIconForPageURL(m_urlsToRelease[i]);
     1506    printf("Retained %lu, released %lu\n", m_urlsToRetain.size(), m_urlsToRelease.size());
     1507
     1508    m_urlsToRetain.clear();
     1509    m_urlsToRelease.clear();
     1510    m_retainOrReleaseIconRequested = false;
    14721511}
    14731512
  • trunk/Source/WebCore/loader/icon/IconDatabase.h

    r109527 r116969  
    160160    bool m_syncThreadHasWorkToDo;
    161161    bool m_disabledSuddenTerminationForSyncThread;
     162    bool m_retainOrReleaseIconRequested;
    162163
    163164    Mutex m_urlAndIconLock;
     
    177178    HashSet<String> m_pageURLsInterestedInIcons;
    178179    HashSet<IconRecord*> m_iconsPendingReading;
     180
     181    Mutex m_urlsToRetainOrReleaseLock;
     182    // Holding m_urlsToRetainOrReleaseLock is required when accessing any of the following data structures.
     183    Vector<String> m_urlsToRetain;
     184    Vector<String> m_urlsToRelease;
    179185
    180186// *** Sync Thread Only ***
     
    203209    void deleteAllPreparedStatements();
    204210    void* cleanupSyncThread();
     211    void performRetainIconForPageURL(const String&);
     212    void performReleaseIconForPageURL(const String&);
    205213
    206214    // Record (on disk) whether or not Safari 2-style icons were imported (once per dataabse)
     
    221229    void removeIconFromSQLDatabase(const String& iconURL);
    222230    void writeIconSnapshotToSQLDatabase(const IconSnapshot&);   
    223    
     231
     232    void performPendingRetainAndReleaseOperations();
     233
    224234    // Methods to dispatch client callbacks on the main thread
    225235    void dispatchDidImportIconURLForPageURLOnMainThread(const String&);
  • trunk/Source/WebKit2/ChangeLog

    r116967 r116969  
     12012-05-14  Andreas Kling  <kling@webkit.org>
     2
     3        REGRESSION(r116796): Assertion failure in API tests
     4        <http://webkit.org/b/86378>
     5        <rdar://problem/10777218>
     6
     7        Reviewed by Anders Carlsson.
     8
     9        Invalidate the plugin work queue in ~WebContext to avoid hitting
     10        the !m_isValid assertion in ~WorkQueue later on.
     11
     12        * UIProcess/WebContext.cpp:
     13        (WebKit::WebContext::~WebContext):
     14
    1152012-05-14  Csaba Osztrogonác  <ossy@webkit.org>
    216
  • trunk/Source/WebKit2/UIProcess/WebContext.cpp

    r116796 r116969  
    167167WebContext::~WebContext()
    168168{
     169    m_pluginWorkQueue.invalidate();
     170
    169171    if (m_process && m_process->isValid())
    170172        m_process->connection()->removeQueueClient(this);
Note: See TracChangeset for help on using the changeset viewer.