| OLD | NEW |
| 1 /* | 1 /* |
| 2 * Copyright (C) 2013 Apple Inc. All rights reserved. | 2 * Copyright (C) 2013 Apple Inc. All rights reserved. |
| 3 * | 3 * |
| 4 * Redistribution and use in source and binary forms, with or without | 4 * Redistribution and use in source and binary forms, with or without |
| 5 * modification, are permitted provided that the following conditions | 5 * modification, are permitted provided that the following conditions |
| 6 * are met: | 6 * are met: |
| 7 * 1. Redistributions of source code must retain the above copyright | 7 * 1. Redistributions of source code must retain the above copyright |
| 8 * notice, this list of conditions and the following disclaimer. | 8 * notice, this list of conditions and the following disclaimer. |
| 9 * 2. Redistributions in binary form must reproduce the above copyright | 9 * 2. Redistributions in binary form must reproduce the above copyright |
| 10 * notice, this list of conditions and the following disclaimer in the | 10 * notice, this list of conditions and the following disclaimer in the |
| (...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 42 | 42 |
| 43 DatabaseBackend::DatabaseBackend(PassRefPtr<DatabaseContext> databaseContext, co
nst String& name, const String& expectedVersion, const String& displayName, unsi
gned long estimatedSize) | 43 DatabaseBackend::DatabaseBackend(PassRefPtr<DatabaseContext> databaseContext, co
nst String& name, const String& expectedVersion, const String& displayName, unsi
gned long estimatedSize) |
| 44 : DatabaseBackendBase(databaseContext, name, expectedVersion, displayName, e
stimatedSize, DatabaseType::Async) | 44 : DatabaseBackendBase(databaseContext, name, expectedVersion, displayName, e
stimatedSize, DatabaseType::Async) |
| 45 , m_transactionInProgress(false) | 45 , m_transactionInProgress(false) |
| 46 , m_isTransactionQueueEnabled(true) | 46 , m_isTransactionQueueEnabled(true) |
| 47 { | 47 { |
| 48 } | 48 } |
| 49 | 49 |
| 50 void DatabaseBackend::trace(Visitor* visitor) | 50 void DatabaseBackend::trace(Visitor* visitor) |
| 51 { | 51 { |
| 52 visitor->trace(m_transactionQueue); |
| 52 DatabaseBackendBase::trace(visitor); | 53 DatabaseBackendBase::trace(visitor); |
| 53 } | 54 } |
| 54 | 55 |
| 55 bool DatabaseBackend::openAndVerifyVersion(bool setVersionInNewDatabase, Databas
eError& error, String& errorMessage) | 56 bool DatabaseBackend::openAndVerifyVersion(bool setVersionInNewDatabase, Databas
eError& error, String& errorMessage) |
| 56 { | 57 { |
| 57 DatabaseTaskSynchronizer synchronizer; | 58 DatabaseTaskSynchronizer synchronizer; |
| 58 if (!databaseContext()->databaseThread() || databaseContext()->databaseThrea
d()->terminationRequested(&synchronizer)) | 59 if (!databaseContext()->databaseThread() || databaseContext()->databaseThrea
d()->terminationRequested(&synchronizer)) |
| 59 return false; | 60 return false; |
| 60 | 61 |
| 61 DatabaseTracker::tracker().prepareToOpenDatabase(this); | 62 DatabaseTracker::tracker().prepareToOpenDatabase(this); |
| (...skipping 21 matching lines...) Expand all Loading... |
| 83 { | 84 { |
| 84 ASSERT(databaseContext()->databaseThread()); | 85 ASSERT(databaseContext()->databaseThread()); |
| 85 ASSERT(databaseContext()->databaseThread()->isDatabaseThread()); | 86 ASSERT(databaseContext()->databaseThread()->isDatabaseThread()); |
| 86 | 87 |
| 87 { | 88 { |
| 88 MutexLocker locker(m_transactionInProgressMutex); | 89 MutexLocker locker(m_transactionInProgressMutex); |
| 89 | 90 |
| 90 // Clean up transactions that have not been scheduled yet: | 91 // Clean up transactions that have not been scheduled yet: |
| 91 // Transaction phase 1 cleanup. See comment on "What happens if a | 92 // Transaction phase 1 cleanup. See comment on "What happens if a |
| 92 // transaction is interrupted?" at the top of SQLTransactionBackend.cpp. | 93 // transaction is interrupted?" at the top of SQLTransactionBackend.cpp. |
| 93 RefPtr<SQLTransactionBackend> transaction; | 94 RefPtrWillBeRawPtr<SQLTransactionBackend> transaction; |
| 94 while (!m_transactionQueue.isEmpty()) { | 95 while (!m_transactionQueue.isEmpty()) { |
| 95 transaction = m_transactionQueue.takeFirst(); | 96 transaction = m_transactionQueue.takeFirst(); |
| 96 transaction->notifyDatabaseThreadIsShuttingDown(); | 97 transaction->notifyDatabaseThreadIsShuttingDown(); |
| 97 } | 98 } |
| 98 | 99 |
| 99 m_isTransactionQueueEnabled = false; | 100 m_isTransactionQueueEnabled = false; |
| 100 m_transactionInProgress = false; | 101 m_transactionInProgress = false; |
| 101 } | 102 } |
| 102 | 103 |
| 103 closeDatabase(); | 104 closeDatabase(); |
| 104 databaseContext()->databaseThread()->recordDatabaseClosed(this); | 105 databaseContext()->databaseThread()->recordDatabaseClosed(this); |
| 105 } | 106 } |
| 106 | 107 |
| 107 PassRefPtr<SQLTransactionBackend> DatabaseBackend::runTransaction(PassRefPtrWill
BeRawPtr<SQLTransaction> transaction, | 108 PassRefPtrWillBeRawPtr<SQLTransactionBackend> DatabaseBackend::runTransaction(Pa
ssRefPtrWillBeRawPtr<SQLTransaction> transaction, |
| 108 bool readOnly, const ChangeVersionData* data) | 109 bool readOnly, const ChangeVersionData* data) |
| 109 { | 110 { |
| 110 MutexLocker locker(m_transactionInProgressMutex); | 111 MutexLocker locker(m_transactionInProgressMutex); |
| 111 if (!m_isTransactionQueueEnabled) | 112 if (!m_isTransactionQueueEnabled) |
| 112 return nullptr; | 113 return nullptr; |
| 113 | 114 |
| 114 RefPtr<SQLTransactionWrapper> wrapper; | 115 RefPtr<SQLTransactionWrapper> wrapper; |
| 115 if (data) | 116 if (data) |
| 116 wrapper = ChangeVersionWrapper::create(data->oldVersion(), data->newVers
ion()); | 117 wrapper = ChangeVersionWrapper::create(data->oldVersion(), data->newVers
ion()); |
| 117 | 118 |
| 118 RefPtr<SQLTransactionBackend> transactionBackend = SQLTransactionBackend::cr
eate(this, transaction, wrapper, readOnly); | 119 RefPtrWillBeRawPtr<SQLTransactionBackend> transactionBackend = SQLTransactio
nBackend::create(this, transaction, wrapper, readOnly); |
| 119 m_transactionQueue.append(transactionBackend); | 120 m_transactionQueue.append(transactionBackend); |
| 120 if (!m_transactionInProgress) | 121 if (!m_transactionInProgress) |
| 121 scheduleTransaction(); | 122 scheduleTransaction(); |
| 122 | 123 |
| 123 return transactionBackend; | 124 return transactionBackend; |
| 124 } | 125 } |
| 125 | 126 |
| 126 void DatabaseBackend::inProgressTransactionCompleted() | 127 void DatabaseBackend::inProgressTransactionCompleted() |
| 127 { | 128 { |
| 128 MutexLocker locker(m_transactionInProgressMutex); | 129 MutexLocker locker(m_transactionInProgressMutex); |
| 129 m_transactionInProgress = false; | 130 m_transactionInProgress = false; |
| 130 scheduleTransaction(); | 131 scheduleTransaction(); |
| 131 } | 132 } |
| 132 | 133 |
| 133 void DatabaseBackend::scheduleTransaction() | 134 void DatabaseBackend::scheduleTransaction() |
| 134 { | 135 { |
| 135 ASSERT(!m_transactionInProgressMutex.tryLock()); // Locked by caller. | 136 ASSERT(!m_transactionInProgressMutex.tryLock()); // Locked by caller. |
| 136 RefPtr<SQLTransactionBackend> transaction; | 137 RefPtrWillBeRawPtr<SQLTransactionBackend> transaction; |
| 137 | 138 |
| 138 if (m_isTransactionQueueEnabled && !m_transactionQueue.isEmpty()) | 139 if (m_isTransactionQueueEnabled && !m_transactionQueue.isEmpty()) |
| 139 transaction = m_transactionQueue.takeFirst(); | 140 transaction = m_transactionQueue.takeFirst(); |
| 140 | 141 |
| 141 if (transaction && databaseContext()->databaseThread()) { | 142 if (transaction && databaseContext()->databaseThread()) { |
| 142 OwnPtr<DatabaseTransactionTask> task = DatabaseTransactionTask::create(t
ransaction); | 143 OwnPtr<DatabaseTransactionTask> task = DatabaseTransactionTask::create(t
ransaction); |
| 143 WTF_LOG(StorageAPI, "Scheduling DatabaseTransactionTask %p for transacti
on %p\n", task.get(), task->transaction()); | 144 WTF_LOG(StorageAPI, "Scheduling DatabaseTransactionTask %p for transacti
on %p\n", task.get(), task->transaction()); |
| 144 m_transactionInProgress = true; | 145 m_transactionInProgress = true; |
| 145 databaseContext()->databaseThread()->scheduleTask(task.release()); | 146 databaseContext()->databaseThread()->scheduleTask(task.release()); |
| 146 } else | 147 } else |
| (...skipping 14 matching lines...) Expand all Loading... |
| 161 { | 162 { |
| 162 return databaseContext()->databaseThread()->transactionClient(); | 163 return databaseContext()->databaseThread()->transactionClient(); |
| 163 } | 164 } |
| 164 | 165 |
| 165 SQLTransactionCoordinator* DatabaseBackend::transactionCoordinator() const | 166 SQLTransactionCoordinator* DatabaseBackend::transactionCoordinator() const |
| 166 { | 167 { |
| 167 return databaseContext()->databaseThread()->transactionCoordinator(); | 168 return databaseContext()->databaseThread()->transactionCoordinator(); |
| 168 } | 169 } |
| 169 | 170 |
| 170 } // namespace WebCore | 171 } // namespace WebCore |
| OLD | NEW |