2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved.
4 * Redistribution and use in source and binary forms, with or without
5 * modification, are permitted provided that the following conditions
8 * 1. Redistributions of source code must retain the above copyright
9 * notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 * notice, this list of conditions and the following disclaimer in the
12 * documentation and/or other materials provided with the distribution.
13 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of
14 * its contributors may be used to endorse or promote products derived
15 * from this software without specific prior written permission.
17 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
18 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
19 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
20 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
21 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
22 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
23 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
24 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
25 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
26 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29 #include "DatabaseThread.h"
31 #include "AutodrainedPool.h"
33 #include "DatabaseTask.h"
38 DatabaseThread::DatabaseThread(Document* document)
44 DatabaseThread::~DatabaseThread()
46 // FIXME: Any cleanup required here? Since the thread deletes itself after running its detached course, I don't think so. Lets be sure.
49 bool DatabaseThread::start()
54 m_threadID = createThread(DatabaseThread::databaseThreadStart, this);
59 void DatabaseThread::requestTermination()
61 LOG(StorageAPI, "DatabaseThread %p was asked to terminate\n", this);
65 void* DatabaseThread::databaseThreadStart(void* vDatabaseThread)
67 DatabaseThread* dbThread = static_cast<DatabaseThread*>(vDatabaseThread);
68 return dbThread->databaseThread();
71 void* DatabaseThread::databaseThread()
73 LOG(StorageAPI, "Starting DatabaseThread %p", this);
77 RefPtr<DatabaseTask> task;
78 if (!m_queue.waitForMessage(task))
86 LOG(StorageAPI, "About to detach thread %i and clear the ref to DatabaseThread %p, which currently has %i ref(s)", m_threadID, this, refCount());
88 // Detach the thread so its resources are no longer of any concern to anyone else
89 detachThread(m_threadID);
91 // Clear the self refptr, possibly resulting in deletion
97 void DatabaseThread::scheduleTask(DatabaseTask* task)
102 void DatabaseThread::scheduleImmediateTask(DatabaseTask* task)
104 m_queue.prepend(task);
107 void DatabaseThread::unscheduleDatabaseTasks(Database* database)
109 // Note that the thread loop is running, so some tasks for the database
110 // may still be executed. This is unavoidable.
112 Deque<RefPtr<DatabaseTask> > filteredReverseQueue;
113 RefPtr<DatabaseTask> task;
114 while (m_queue.tryGetMessage(task)) {
115 if (task->database() != database)
116 filteredReverseQueue.append(task);
119 while (!filteredReverseQueue.isEmpty()) {
120 m_queue.append(filteredReverseQueue.first());
121 filteredReverseQueue.removeFirst();
125 } // namespace WebCore