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 |