OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. | 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. |
3 * Copyright (C) 2011 Google, Inc. All Rights Reserved. | 3 * Copyright (C) 2011 Google, Inc. All Rights Reserved. |
4 * | 4 * |
5 * Redistribution and use in source and binary forms, with or without | 5 * Redistribution and use in source and binary forms, with or without |
6 * modification, are permitted provided that the following conditions | 6 * modification, are permitted provided that the following conditions |
7 * are met: | 7 * are met: |
8 * 1. Redistributions of source code must retain the above copyright | 8 * 1. Redistributions of source code must retain the above copyright |
9 * notice, this list of conditions and the following disclaimer. | 9 * notice, this list of conditions and the following disclaimer. |
10 * 2. Redistributions in binary form must reproduce the above copyright | 10 * 2. Redistributions in binary form must reproduce the above copyright |
(...skipping 152 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
163 } | 163 } |
164 | 164 |
165 return m_databaseThread.get(); | 165 return m_databaseThread.get(); |
166 } | 166 } |
167 | 167 |
168 void DatabaseContext::didOpenDatabase(DatabaseBackendBase& database) | 168 void DatabaseContext::didOpenDatabase(DatabaseBackendBase& database) |
169 { | 169 { |
170 if (!database.isSyncDatabase()) | 170 if (!database.isSyncDatabase()) |
171 return; | 171 return; |
172 ASSERT(isContextThread()); | 172 ASSERT(isContextThread()); |
| 173 #if ENABLE(OILPAN) |
| 174 m_openSyncDatabases.add(&database, adoptPtr(new DatabaseCloser(database))); |
| 175 #else |
173 m_openSyncDatabases.add(&database); | 176 m_openSyncDatabases.add(&database); |
| 177 #endif |
174 } | 178 } |
175 | 179 |
176 void DatabaseContext::didCloseDatabase(DatabaseBackendBase& database) | 180 void DatabaseContext::didCloseDatabase(DatabaseBackendBase& database) |
177 { | 181 { |
| 182 #if !ENABLE(OILPAN) |
178 if (!database.isSyncDatabase()) | 183 if (!database.isSyncDatabase()) |
179 return; | 184 return; |
180 ASSERT(isContextThread()); | 185 ASSERT(isContextThread()); |
181 m_openSyncDatabases.remove(&database); | 186 m_openSyncDatabases.remove(&database); |
| 187 #endif |
182 } | 188 } |
183 | 189 |
| 190 #if ENABLE(OILPAN) |
| 191 DatabaseContext::DatabaseCloser::~DatabaseCloser() |
| 192 { |
| 193 m_database.closeImmediately(); |
| 194 } |
| 195 #endif |
| 196 |
184 void DatabaseContext::stopSyncDatabases() | 197 void DatabaseContext::stopSyncDatabases() |
185 { | 198 { |
186 // SQLite is "multi-thread safe", but each database handle can only be used | 199 // SQLite is "multi-thread safe", but each database handle can only be used |
187 // on a single thread at a time. | 200 // on a single thread at a time. |
188 // | 201 // |
189 // For DatabaseBackendSync, we open the SQLite database on the script | 202 // For DatabaseBackendSync, we open the SQLite database on the script |
190 // context thread. And hence we should also close it on that same | 203 // context thread. And hence we should also close it on that same |
191 // thread. This means that the SQLite database need to be closed here in the | 204 // thread. This means that the SQLite database need to be closed here in the |
192 // destructor. | 205 // destructor. |
193 ASSERT(isContextThread()); | 206 ASSERT(isContextThread()); |
| 207 #if ENABLE(OILPAN) |
| 208 // FIXME: We need to clear OwnPtr<> in the HeapHashMap explicitly. |
| 209 // HeapHashMap::clear() doesn't destruct values |
| 210 // immediately. crbug.com/357113. |
| 211 for (PersistentHeapHashMap<WeakMember<DatabaseBackendBase>, OwnPtr<DatabaseC
loser> >::iterator i = m_openSyncDatabases.begin(); i != m_openSyncDatabases.end
(); ++i) |
| 212 (*i).value.clear(); |
| 213 m_openSyncDatabases.clear(); |
| 214 #else |
194 Vector<DatabaseBackendBase*> syncDatabases; | 215 Vector<DatabaseBackendBase*> syncDatabases; |
195 copyToVector(m_openSyncDatabases, syncDatabases); | 216 copyToVector(m_openSyncDatabases, syncDatabases); |
196 m_openSyncDatabases.clear(); | 217 m_openSyncDatabases.clear(); |
197 for (size_t i = 0; i < syncDatabases.size(); ++i) | 218 for (size_t i = 0; i < syncDatabases.size(); ++i) |
198 syncDatabases[i]->closeImmediately(); | 219 syncDatabases[i]->closeImmediately(); |
| 220 #endif |
199 } | 221 } |
200 | 222 |
201 void DatabaseContext::stopDatabases() | 223 void DatabaseContext::stopDatabases() |
202 { | 224 { |
203 stopSyncDatabases(); | 225 stopSyncDatabases(); |
204 | 226 |
205 // Though we initiate termination of the DatabaseThread here in | 227 // Though we initiate termination of the DatabaseThread here in |
206 // stopDatabases(), we can't clear the m_databaseThread ref till we get to | 228 // stopDatabases(), we can't clear the m_databaseThread ref till we get to |
207 // the destructor. This is because the Databases that are managed by | 229 // the destructor. This is because the Databases that are managed by |
208 // DatabaseThread still rely on this ref between the context and the thread | 230 // DatabaseThread still rely on this ref between the context and the thread |
(...skipping 24 matching lines...) Expand all Loading... |
233 { | 255 { |
234 return executionContext()->securityOrigin(); | 256 return executionContext()->securityOrigin(); |
235 } | 257 } |
236 | 258 |
237 bool DatabaseContext::isContextThread() const | 259 bool DatabaseContext::isContextThread() const |
238 { | 260 { |
239 return executionContext()->isContextThread(); | 261 return executionContext()->isContextThread(); |
240 } | 262 } |
241 | 263 |
242 } // namespace WebCore | 264 } // namespace WebCore |
OLD | NEW |