Commit 9f495748 authored by haraken's avatar haraken Committed by Commit bot

Revert of Enable per thread heap for database thread (patchset #12 id:220001...

Revert of Enable per thread heap for database thread (patchset #12 id:220001 of https://codereview.chromium.org/1909813002/ )

Reason for revert:
This CL is causing a top #1 crasher.

https://bugs.chromium.org/p/chromium/issues/detail?id=617141

Original issue's description:
> Enable per thread heap for database thread
>
> BUG=591606
>
> Committed: https://crrev.com/993e3a74102e0843bebb2f52de1a904f151843d4
> Cr-Commit-Position: refs/heads/master@{#397383}

TBR=oilpan-reviews@chromium.org,keishi@chromium.org
# Not skipping CQ checks because original CL landed more than 1 days ago.
BUG=591606

Review-Url: https://codereview.chromium.org/2037233002
Cr-Commit-Position: refs/heads/master@{#397884}
parent b3464215
......@@ -215,7 +215,6 @@ Database::Database(DatabaseContext* databaseContext, const String& name, const S
, m_transactionInProgress(false)
, m_isTransactionQueueEnabled(true)
{
DCHECK(isMainThread());
m_contextThreadSecurityOrigin = m_databaseContext->getSecurityOrigin()->isolatedCopy();
m_databaseAuthorizer = DatabaseAuthorizer::create(infoTableName);
......
......@@ -39,8 +39,6 @@ DatabaseAuthorizer::DatabaseAuthorizer(const String& databaseInfoTableName)
: m_securityEnabled(false)
, m_databaseInfoTableName(databaseInfoTableName)
{
DCHECK(isMainThread());
reset();
addWhitelistedFunctions();
}
......
......@@ -100,8 +100,6 @@ DatabaseContext::DatabaseContext(ExecutionContext* context)
, m_hasOpenDatabases(false)
, m_hasRequestedTermination(false)
{
DCHECK(isMainThread());
// ActiveDOMObject expects this to be called to set internal flags.
suspendIfNeeded();
......
......@@ -48,7 +48,7 @@ static DatabaseManager* s_databaseManager;
DatabaseManager& DatabaseManager::manager()
{
DCHECK(isMainThread());
ASSERT(isMainThread());
if (!s_databaseManager)
s_databaseManager = new DatabaseManager();
return *s_databaseManager;
......@@ -56,7 +56,7 @@ DatabaseManager& DatabaseManager::manager()
void DatabaseManager::terminateDatabaseThread()
{
DCHECK(isMainThread());
ASSERT(isMainThread());
if (!s_databaseManager)
return;
for (const Member<DatabaseContext>& context : s_databaseManager->m_contextMap.values())
......
......@@ -41,10 +41,10 @@ namespace blink {
DatabaseThread::DatabaseThread()
: m_transactionClient(adoptPtr(new SQLTransactionClient()))
, m_transactionCoordinator(new SQLTransactionCoordinator())
, m_cleanupSync(nullptr)
, m_terminationRequested(false)
{
DCHECK(isMainThread());
}
DatabaseThread::~DatabaseThread()
......@@ -55,6 +55,8 @@ DatabaseThread::~DatabaseThread()
DEFINE_TRACE(DatabaseThread)
{
visitor->trace(m_openDatabaseSet);
visitor->trace(m_transactionCoordinator);
}
void DatabaseThread::start()
......@@ -62,14 +64,13 @@ void DatabaseThread::start()
ASSERT(isMainThread());
if (m_thread)
return;
m_thread = WebThreadSupportingGC::create("WebCore: Database", true);
m_thread = WebThreadSupportingGC::create("WebCore: Database");
m_thread->postTask(BLINK_FROM_HERE, threadSafeBind(&DatabaseThread::setupDatabaseThread, wrapCrossThreadPersistent(this)));
}
void DatabaseThread::setupDatabaseThread()
{
m_thread->initialize();
m_transactionCoordinator = new SQLTransactionCoordinator();
}
void DatabaseThread::terminate()
......@@ -93,8 +94,6 @@ void DatabaseThread::terminate()
void DatabaseThread::cleanupDatabaseThread()
{
DCHECK(isDatabaseThread());
WTF_LOG(StorageAPI, "Cleaning up DatabaseThread %p", this);
// Clean up the list of all pending transactions on this database thread
......@@ -104,10 +103,10 @@ void DatabaseThread::cleanupDatabaseThread()
// inconsistent or locked state.
if (m_openDatabaseSet.size() > 0) {
// As the call to close will modify the original set, we must take a copy to iterate over.
HashSet<CrossThreadPersistent<Database>> openSetCopy;
HeapHashSet<Member<Database>> openSetCopy;
openSetCopy.swap(m_openDatabaseSet);
HashSet<CrossThreadPersistent<Database>>::iterator end = openSetCopy.end();
for (HashSet<CrossThreadPersistent<Database>>::iterator it = openSetCopy.begin(); it != end; ++it)
HeapHashSet<Member<Database>>::iterator end = openSetCopy.end();
for (HeapHashSet<Member<Database>>::iterator it = openSetCopy.begin(); it != end; ++it)
(*it)->close();
}
m_openDatabaseSet.clear();
......
......@@ -77,10 +77,10 @@ private:
// This set keeps track of the open databases that have been used on this thread.
// This must be updated in the database thread though it is constructed and
// destructed in the context thread.
HashSet<CrossThreadPersistent<Database>> m_openDatabaseSet;
HeapHashSet<Member<Database>> m_openDatabaseSet;
OwnPtr<SQLTransactionClient> m_transactionClient;
CrossThreadPersistent<SQLTransactionCoordinator> m_transactionCoordinator;
Member<SQLTransactionCoordinator> m_transactionCoordinator;
TaskSynchronizer* m_cleanupSync;
Mutex m_terminationRequestedMutex;
......
......@@ -41,7 +41,6 @@ SQLResultSet::SQLResultSet()
, m_insertIdSet(false)
, m_isValid(false)
{
DCHECK(isMainThread());
}
DEFINE_TRACE(SQLResultSet)
......
......@@ -54,8 +54,6 @@ SQLStatement::SQLStatement(Database* database, SQLStatementCallback* callback,
: m_statementCallback(callback)
, m_statementErrorCallback(errorCallback)
{
DCHECK(isMainThread());
if (hasCallback() || hasErrorCallback())
InspectorInstrumentation::asyncTaskScheduled(database->getExecutionContext(), "SQLStatement", this);
}
......
......@@ -87,8 +87,6 @@ SQLStatementBackend::SQLStatementBackend(SQLStatement* frontend,
, m_resultSet(SQLResultSet::create())
, m_permissions(permissions)
{
DCHECK(isMainThread());
m_frontend->setBackend(this);
}
......
......@@ -64,7 +64,6 @@ SQLTransaction::SQLTransaction(Database* db, SQLTransactionCallback* callback,
, m_executeSqlAllowed(false)
, m_readOnly(readOnly)
{
DCHECK(isMainThread());
ASSERT(m_database);
InspectorInstrumentation::asyncTaskScheduled(db->getExecutionContext(), "SQLTransaction", this, true);
}
......
......@@ -356,7 +356,6 @@ SQLTransactionBackend::SQLTransactionBackend(Database* db, SQLTransaction* front
, m_readOnly(readOnly)
, m_hasVersionMismatch(false)
{
DCHECK(isMainThread());
ASSERT(m_database);
m_frontend->setBackend(this);
m_requestedState = SQLTransactionState::AcquireLock;
......
......@@ -50,6 +50,7 @@ SQLTransactionCoordinator::SQLTransactionCoordinator()
DEFINE_TRACE(SQLTransactionCoordinator)
{
visitor->trace(m_coordinationInfoMap);
}
void SQLTransactionCoordinator::processPendingTransactions(CoordinationInfo& info)
......@@ -129,8 +130,11 @@ void SQLTransactionCoordinator::shutdown()
// transaction is interrupted?" at the top of SQLTransactionBackend.cpp.
if (info.activeWriteTransaction)
info.activeWriteTransaction->notifyDatabaseThreadIsShuttingDown();
for (auto& it : info.activeReadTransactions) {
it->notifyDatabaseThreadIsShuttingDown();
for (HeapHashSet<Member<SQLTransactionBackend>>::iterator activeReadTransactionsIterator =
info.activeReadTransactions.begin();
activeReadTransactionsIterator != info.activeReadTransactions.end();
++activeReadTransactionsIterator) {
(*activeReadTransactionsIterator)->notifyDatabaseThreadIsShuttingDown();
}
// Clean up transactions that have NOT reached "lockAcquired":
......
......@@ -42,7 +42,7 @@ namespace blink {
class SQLTransactionBackend;
class SQLTransactionCoordinator : public GarbageCollectedFinalized<SQLTransactionCoordinator> {
class SQLTransactionCoordinator : public GarbageCollected<SQLTransactionCoordinator> {
WTF_MAKE_NONCOPYABLE(SQLTransactionCoordinator);
public:
SQLTransactionCoordinator();
......@@ -52,16 +52,23 @@ public:
void shutdown();
private:
typedef Deque<CrossThreadPersistent<SQLTransactionBackend>> TransactionsQueue;
typedef HeapDeque<Member<SQLTransactionBackend>> TransactionsQueue;
struct CoordinationInfo {
DISALLOW_NEW_EXCEPT_PLACEMENT_NEW();
public:
TransactionsQueue pendingTransactions;
HashSet<CrossThreadPersistent<SQLTransactionBackend>> activeReadTransactions;
CrossThreadPersistent<SQLTransactionBackend> activeWriteTransaction;
HeapHashSet<Member<SQLTransactionBackend>> activeReadTransactions;
Member<SQLTransactionBackend> activeWriteTransaction;
DEFINE_INLINE_TRACE()
{
visitor->trace(pendingTransactions);
visitor->trace(activeReadTransactions);
visitor->trace(activeWriteTransaction);
}
};
// Maps database names to information about pending transactions
typedef HashMap<String, CoordinationInfo> CoordinationInfoHeapMap;
typedef HeapHashMap<String, CoordinationInfo> CoordinationInfoHeapMap;
CoordinationInfoHeapMap m_coordinationInfoMap;
bool m_isShuttingDown;
......
......@@ -205,8 +205,7 @@ public:
// TODO(keishi): some tests create CrossThreadPersistent on non attached threads.
if (!ThreadState::current())
return true;
if (&ThreadState::current()->heap() != &pageFromObject(object)->arena()->getThreadState()->heap())
return true;
DCHECK(&ThreadState::current()->heap() == &pageFromObject(object)->arena()->getThreadState()->heap());
return ObjectAliveTrait<T>::isHeapObjectAlive(object);
}
template<typename T>
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment