Changeset 243939 in webkit
- Timestamp:
- Apr 5, 2019 11:06:09 AM (5 years ago)
- Location:
- trunk/Source
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/Source/WebCore/ChangeLog
r243934 r243939 1 2019-04-05 Sihui Liu <sihui_liu@apple.com> 2 3 [iOS] Web process gets suspended while holding locked database files 4 https://bugs.webkit.org/show_bug.cgi?id=196519 5 <rdar://problem/49531797> 6 7 Reviewed by Chris Dumez. 8 9 We should close all databases and make sure not open new databases when web process is ready to suspend. 10 11 * platform/sql/SQLiteDatabase.cpp: 12 (WebCore::SQLiteDatabase::setIsDatabaseOpeningForbidden): 13 (WebCore::SQLiteDatabase::open): 14 * platform/sql/SQLiteDatabase.h: 15 * platform/sql/SQLiteDatabaseTracker.cpp: 16 (WebCore::SQLiteDatabaseTracker::setClient): 17 (WebCore::SQLiteDatabaseTracker::incrementTransactionInProgressCount): 18 (WebCore::SQLiteDatabaseTracker::decrementTransactionInProgressCount): 19 (WebCore::SQLiteDatabaseTracker::hasTransactionInProgress): 20 1 21 2019-04-05 Commit Queue <commit-queue@webkit.org> 2 22 -
trunk/Source/WebCore/platform/sql/SQLiteDatabase.cpp
r243085 r243939 72 72 } 73 73 74 static bool isDatabaseOpeningForbidden = false; 75 static Lock isDatabaseOpeningForbiddenMutex; 76 77 void SQLiteDatabase::setIsDatabaseOpeningForbidden(bool isForbidden) 78 { 79 std::lock_guard<Lock> lock(isDatabaseOpeningForbiddenMutex); 80 isDatabaseOpeningForbidden = isForbidden; 81 } 82 74 83 SQLiteDatabase::SQLiteDatabase() = default; 75 84 … … 85 94 close(); 86 95 87 int flags = SQLITE_OPEN_AUTOPROXY; 88 switch (openMode) { 89 case OpenMode::ReadOnly: 90 flags |= SQLITE_OPEN_READONLY; 91 break; 92 case OpenMode::ReadWrite: 93 flags |= SQLITE_OPEN_READWRITE; 94 break; 95 case OpenMode::ReadWriteCreate: 96 flags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; 97 break; 98 } 99 100 m_openError = sqlite3_open_v2(FileSystem::fileSystemRepresentation(filename).data(), &m_db, flags, nullptr); 101 if (m_openError != SQLITE_OK) { 102 m_openErrorMessage = m_db ? sqlite3_errmsg(m_db) : "sqlite_open returned null"; 103 LOG_ERROR("SQLite database failed to load from %s\nCause - %s", filename.ascii().data(), 104 m_openErrorMessage.data()); 105 sqlite3_close(m_db); 106 m_db = 0; 107 return false; 96 { 97 std::lock_guard<Lock> lock(isDatabaseOpeningForbiddenMutex); 98 if (isDatabaseOpeningForbidden) { 99 m_openErrorMessage = "opening database is forbidden"; 100 return false; 101 } 102 103 int flags = SQLITE_OPEN_AUTOPROXY; 104 switch (openMode) { 105 case OpenMode::ReadOnly: 106 flags |= SQLITE_OPEN_READONLY; 107 break; 108 case OpenMode::ReadWrite: 109 flags |= SQLITE_OPEN_READWRITE; 110 break; 111 case OpenMode::ReadWriteCreate: 112 flags |= SQLITE_OPEN_READWRITE | SQLITE_OPEN_CREATE; 113 break; 114 } 115 116 m_openError = sqlite3_open_v2(FileSystem::fileSystemRepresentation(filename).data(), &m_db, flags, nullptr); 117 if (m_openError != SQLITE_OK) { 118 m_openErrorMessage = m_db ? sqlite3_errmsg(m_db) : "sqlite_open returned null"; 119 LOG_ERROR("SQLite database failed to load from %s\nCause - %s", filename.ascii().data(), 120 m_openErrorMessage.data()); 121 sqlite3_close(m_db); 122 m_db = 0; 123 return false; 124 } 108 125 } 109 126 -
trunk/Source/WebCore/platform/sql/SQLiteDatabase.h
r242983 r243939 139 139 #endif 140 140 141 WEBCORE_EXPORT static void setIsDatabaseOpeningForbidden(bool); 142 141 143 private: 142 144 static int authorizerFunction(void*, int, const char*, const char*, const char*, const char*); -
trunk/Source/WebCore/platform/sql/SQLiteDatabaseTracker.cpp
r230303 r243939 41 41 void setClient(SQLiteDatabaseTrackerClient* client) 42 42 { 43 ASSERT(client); 44 ASSERT(!s_staticSQLiteDatabaseTrackerClient || s_staticSQLiteDatabaseTrackerClient == client); 43 std::lock_guard<Lock> lock(transactionInProgressMutex); 45 44 s_staticSQLiteDatabaseTrackerClient = client; 46 45 } … … 48 47 void incrementTransactionInProgressCount() 49 48 { 49 std::lock_guard<Lock> lock(transactionInProgressMutex); 50 50 if (!s_staticSQLiteDatabaseTrackerClient) 51 51 return; 52 53 std::lock_guard<Lock> lock(transactionInProgressMutex);54 52 55 53 s_transactionInProgressCounter++; … … 60 58 void decrementTransactionInProgressCount() 61 59 { 60 std::lock_guard<Lock> lock(transactionInProgressMutex); 62 61 if (!s_staticSQLiteDatabaseTrackerClient) 63 62 return; 64 65 std::lock_guard<Lock> lock(transactionInProgressMutex);66 63 67 64 ASSERT(s_transactionInProgressCounter); … … 75 72 bool hasTransactionInProgress() 76 73 { 74 std::lock_guard<Lock> lock(transactionInProgressMutex); 77 75 return !s_staticSQLiteDatabaseTrackerClient || s_transactionInProgressCounter > 0; 78 76 } -
trunk/Source/WebKit/ChangeLog
r243934 r243939 1 2019-04-05 Sihui Liu <sihui_liu@apple.com> 2 3 [iOS] Web process gets suspended while holding locked database files 4 https://bugs.webkit.org/show_bug.cgi?id=196519 5 <rdar://problem/49531797> 6 7 Reviewed by Chris Dumez. 8 9 * Shared/WebSQLiteDatabaseTracker.cpp: 10 (WebKit::WebSQLiteDatabaseTracker::~WebSQLiteDatabaseTracker): 11 * Shared/WebSQLiteDatabaseTracker.h: 12 * WebProcess/WebProcess.cpp: 13 (WebKit::m_webSQLiteDatabaseTracker): 14 (WebKit::WebProcess::actualPrepareToSuspend): 15 (WebKit::WebProcess::processWillSuspendImminently): 16 (WebKit::WebProcess::cancelPrepareToSuspend): 17 (WebKit::WebProcess::processDidResume): 18 * WebProcess/WebProcess.h: 19 1 20 2019-04-05 Commit Queue <commit-queue@webkit.org> 2 21 -
trunk/Source/WebKit/Shared/WebSQLiteDatabaseTracker.cpp
r242230 r243939 53 53 } 54 54 55 WebSQLiteDatabaseTracker::~WebSQLiteDatabaseTracker() 56 { 57 ASSERT(RunLoop::isMain()); 58 SQLiteDatabaseTracker::setClient(nullptr); 59 60 if (m_hysteresis.state() == PAL::HysteresisState::Started) 61 hysteresisUpdated(PAL::HysteresisState::Stopped); 62 } 63 55 64 void WebSQLiteDatabaseTracker::willBeginFirstTransaction() 56 65 { -
trunk/Source/WebKit/Shared/WebSQLiteDatabaseTracker.h
r242230 r243939 41 41 explicit WebSQLiteDatabaseTracker(NetworkProcess&); 42 42 43 ~WebSQLiteDatabaseTracker(); 44 43 45 // WebCore::SQLiteDatabaseTrackerClient 44 46 void willBeginFirstTransaction() override; -
trunk/Source/WebKit/WebProcess/WebProcess.cpp
r243671 r243939 138 138 #endif 139 139 140 #if PLATFORM(IOS_FAMILY) 141 #include "WebSQLiteDatabaseTracker.h" 142 #endif 143 140 144 #if ENABLE(SEC_ITEM_SHIM) 141 145 #include "SecItemShim.h" … … 185 189 , m_nonVisibleProcessCleanupTimer(*this, &WebProcess::nonVisibleProcessCleanupTimerFired) 186 190 #if PLATFORM(IOS_FAMILY) 187 , m_webSQLiteDatabaseTracker( *this)191 , m_webSQLiteDatabaseTracker(std::make_unique<WebSQLiteDatabaseTracker>(*this)) 188 192 #endif 189 193 { … … 1462 1466 1463 1467 #if PLATFORM(IOS_FAMILY) 1468 m_webSQLiteDatabaseTracker = nullptr; 1469 SQLiteDatabase::setIsDatabaseOpeningForbidden(true); 1470 DatabaseTracker::singleton().closeAllDatabases(CurrentQueryBehavior::Interrupt); 1464 1471 accessibilityProcessSuspendedNotification(true); 1465 1472 updateFreezerStatus(); … … 1490 1497 1491 1498 RELEASE_LOG(ProcessSuspension, "%p - WebProcess::processWillSuspendImminently()", this); 1492 DatabaseTracker::singleton().closeAllDatabases(CurrentQueryBehavior::Interrupt);1493 1499 actualPrepareToSuspend(ShouldAcknowledgeWhenReadyToSuspend::No); 1494 1500 completionHandler(true); … … 1507 1513 1508 1514 #if PLATFORM(IOS_FAMILY) 1515 m_webSQLiteDatabaseTracker = std::make_unique<WebSQLiteDatabaseTracker>(*this); 1516 SQLiteDatabase::setIsDatabaseOpeningForbidden(false); 1509 1517 accessibilityProcessSuspendedNotification(false); 1510 1518 #endif … … 1578 1586 1579 1587 #if PLATFORM(IOS_FAMILY) 1588 m_webSQLiteDatabaseTracker = std::make_unique<WebSQLiteDatabaseTracker>(*this); 1589 SQLiteDatabase::setIsDatabaseOpeningForbidden(false); 1580 1590 accessibilityProcessSuspendedNotification(false); 1581 1591 #endif -
trunk/Source/WebKit/WebProcess/WebProcess.h
r243395 r243939 58 58 #endif 59 59 60 #if PLATFORM(IOS_FAMILY)61 #include "WebSQLiteDatabaseTracker.h"62 #endif63 64 60 namespace API { 65 61 class Object; … … 113 109 struct WebPageGroupData; 114 110 struct WebPreferencesStore; 111 class WebSQLiteDatabaseTracker; 115 112 struct WebsiteData; 116 113 struct WebsiteDataStoreParameters; … … 500 497 501 498 #if PLATFORM(IOS_FAMILY) 502 WebSQLiteDatabaseTrackerm_webSQLiteDatabaseTracker;499 std::unique_ptr<WebSQLiteDatabaseTracker> m_webSQLiteDatabaseTracker; 503 500 #endif 504 501
Note: See TracChangeset
for help on using the changeset viewer.