Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1755)

Side by Side Diff: Source/modules/webdatabase/DatabaseContext.cpp

Issue 561093003: Remove worker support of Web SQL Database. (Closed) Base URL: svn://svn.chromium.org/blink/trunk
Patch Set: Created 6 years, 3 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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 87 matching lines...) Expand 10 before | Expand all | Expand 10 after
98 : ActiveDOMObject(context) 98 : ActiveDOMObject(context)
99 , m_hasOpenDatabases(false) 99 , m_hasOpenDatabases(false)
100 , m_hasRequestedTermination(false) 100 , m_hasRequestedTermination(false)
101 { 101 {
102 // ActiveDOMObject expects this to be called to set internal flags. 102 // ActiveDOMObject expects this to be called to set internal flags.
103 suspendIfNeeded(); 103 suspendIfNeeded();
104 104
105 // For debug accounting only. We must do this before we register the 105 // For debug accounting only. We must do this before we register the
106 // instance. The assertions assume this. 106 // instance. The assertions assume this.
107 DatabaseManager::manager().didConstructDatabaseContext(); 107 DatabaseManager::manager().didConstructDatabaseContext();
108 if (context->isWorkerGlobalScope())
109 toWorkerGlobalScope(context)->registerTerminationObserver(this);
110 } 108 }
111 109
112 DatabaseContext::~DatabaseContext() 110 DatabaseContext::~DatabaseContext()
113 { 111 {
114 // For debug accounting only. We must call this last. The assertions assume 112 // For debug accounting only. We must call this last. The assertions assume
115 // this. 113 // this.
116 DatabaseManager::manager().didDestructDatabaseContext(); 114 DatabaseManager::manager().didDestructDatabaseContext();
117 } 115 }
118 116
119 void DatabaseContext::trace(Visitor* visitor) 117 void DatabaseContext::trace(Visitor* visitor)
120 { 118 {
121 #if ENABLE(OILPAN) 119 #if ENABLE(OILPAN)
122 visitor->trace(m_databaseThread); 120 visitor->trace(m_databaseThread);
123 visitor->trace(m_openSyncDatabases);
124 #endif 121 #endif
125 } 122 }
126 123
127 // This is called if the associated ExecutionContext is destructing while 124 // This is called if the associated ExecutionContext is destructing while
128 // we're still associated with it. That's our cue to disassociate and shutdown. 125 // we're still associated with it. That's our cue to disassociate and shutdown.
129 // To do this, we stop the database and let everything shutdown naturally 126 // To do this, we stop the database and let everything shutdown naturally
130 // because the database closing process may still make use of this context. 127 // because the database closing process may still make use of this context.
131 // It is not safe to just delete the context here. 128 // It is not safe to just delete the context here.
132 void DatabaseContext::contextDestroyed() 129 void DatabaseContext::contextDestroyed()
133 { 130 {
134 RefPtrWillBeRawPtr<DatabaseContext> protector(this); 131 RefPtrWillBeRawPtr<DatabaseContext> protector(this);
135 stopDatabases(); 132 stopDatabases();
136 DatabaseManager::manager().unregisterDatabaseContext(this); 133 DatabaseManager::manager().unregisterDatabaseContext(this);
137 ActiveDOMObject::contextDestroyed(); 134 ActiveDOMObject::contextDestroyed();
138 } 135 }
139 136
140 void DatabaseContext::wasRequestedToTerminate()
141 {
142 DatabaseManager::manager().interruptAllDatabasesForContext(this);
143 }
144
145 // stop() is from stopActiveDOMObjects() which indicates that the owner LocalFra me 137 // stop() is from stopActiveDOMObjects() which indicates that the owner LocalFra me
146 // or WorkerThread is shutting down. Initiate the orderly shutdown by stopping 138 // or WorkerThread is shutting down. Initiate the orderly shutdown by stopping
147 // the associated databases. 139 // the associated databases.
148 void DatabaseContext::stop() 140 void DatabaseContext::stop()
149 { 141 {
150 stopDatabases(); 142 stopDatabases();
151 } 143 }
152 144
153 DatabaseContext* DatabaseContext::backend() 145 DatabaseContext* DatabaseContext::backend()
154 { 146 {
(...skipping 11 matching lines...) Expand all
166 158
167 // Create the database thread on first request - but not if at least one database was already opened, 159 // Create the database thread on first request - but not if at least one database was already opened,
168 // because in that case we already had a database thread and terminated it and should not create another. 160 // because in that case we already had a database thread and terminated it and should not create another.
169 m_databaseThread = DatabaseThread::create(); 161 m_databaseThread = DatabaseThread::create();
170 m_databaseThread->start(); 162 m_databaseThread->start();
171 } 163 }
172 164
173 return m_databaseThread.get(); 165 return m_databaseThread.get();
174 } 166 }
175 167
176 void DatabaseContext::didOpenDatabase(DatabaseBackendBase& database)
177 {
178 if (!database.isSyncDatabase())
179 return;
180 ASSERT(isContextThread());
181 #if ENABLE(OILPAN)
182 m_openSyncDatabases.add(&database, adoptPtr(new DatabaseCloser(database)));
183 #else
184 m_openSyncDatabases.add(&database);
185 #endif
186 }
187
188 void DatabaseContext::didCloseDatabase(DatabaseBackendBase& database)
189 {
190 #if !ENABLE(OILPAN)
191 if (!database.isSyncDatabase())
192 return;
193 ASSERT(isContextThread());
194 m_openSyncDatabases.remove(&database);
195 #endif
196 }
197
198 #if ENABLE(OILPAN)
199 DatabaseContext::DatabaseCloser::~DatabaseCloser()
200 {
201 if (m_database.opened())
202 m_database.closeDatabase();
203 }
204 #endif
205
206 void DatabaseContext::stopSyncDatabases()
207 {
208 // SQLite is "multi-thread safe", but each database handle can only be used
209 // on a single thread at a time.
210 //
211 // For DatabaseBackendSync, we open the SQLite database on the script
212 // context thread. And hence we should also close it on that same
213 // thread. This means that the SQLite database need to be closed here in the
214 // destructor.
215 ASSERT(isContextThread());
216 #if ENABLE(OILPAN)
217 m_openSyncDatabases.clear();
218 #else
219 Vector<DatabaseBackendBase*> syncDatabases;
220 copyToVector(m_openSyncDatabases, syncDatabases);
221 m_openSyncDatabases.clear();
222 for (size_t i = 0; i < syncDatabases.size(); ++i)
223 syncDatabases[i]->closeImmediately();
224 #endif
225 }
226
227 void DatabaseContext::stopDatabases() 168 void DatabaseContext::stopDatabases()
228 { 169 {
229 stopSyncDatabases();
230
231 // Though we initiate termination of the DatabaseThread here in 170 // Though we initiate termination of the DatabaseThread here in
232 // stopDatabases(), we can't clear the m_databaseThread ref till we get to 171 // stopDatabases(), we can't clear the m_databaseThread ref till we get to
233 // the destructor. This is because the Databases that are managed by 172 // the destructor. This is because the Databases that are managed by
234 // DatabaseThread still rely on this ref between the context and the thread 173 // DatabaseThread still rely on this ref between the context and the thread
235 // to execute the task for closing the database. By the time we get to the 174 // to execute the task for closing the database. By the time we get to the
236 // destructor, we're guaranteed that the databases are destructed (which is 175 // destructor, we're guaranteed that the databases are destructed (which is
237 // why our ref count is 0 then and we're destructing). Then, the 176 // why our ref count is 0 then and we're destructing). Then, the
238 // m_databaseThread RefPtr destructor will deref and delete the 177 // m_databaseThread RefPtr destructor will deref and delete the
239 // DatabaseThread. 178 // DatabaseThread.
240 179
(...skipping 18 matching lines...) Expand all
259 { 198 {
260 return executionContext()->securityOrigin(); 199 return executionContext()->securityOrigin();
261 } 200 }
262 201
263 bool DatabaseContext::isContextThread() const 202 bool DatabaseContext::isContextThread() const
264 { 203 {
265 return executionContext()->isContextThread(); 204 return executionContext()->isContextThread();
266 } 205 }
267 206
268 } // namespace blink 207 } // namespace blink
OLDNEW
« no previous file with comments | « Source/modules/webdatabase/DatabaseContext.h ('k') | Source/modules/webdatabase/DatabaseManager.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698