1/* 2 * Copyright (C) 2008 Apple Inc. All Rights Reserved. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. ``AS IS'' AND ANY 14 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 15 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR 17 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 18 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 19 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR 20 * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY 21 * OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 22 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 23 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#include "config.h" 27#include "LocalStorageThread.h" 28 29#if ENABLE(DOM_STORAGE) 30 31#include "LocalStorageTask.h" 32#include "StorageAreaSync.h" 33 34namespace WebCore { 35 36PassOwnPtr<LocalStorageThread> LocalStorageThread::create() 37{ 38 return adoptPtr(new LocalStorageThread); 39} 40 41LocalStorageThread::LocalStorageThread() 42 : m_threadID(0) 43{ 44} 45 46LocalStorageThread::~LocalStorageThread() 47{ 48 ASSERT(isMainThread()); 49 ASSERT(!m_threadID); 50} 51 52bool LocalStorageThread::start() 53{ 54 ASSERT(isMainThread()); 55 if (!m_threadID) 56 m_threadID = createThread(LocalStorageThread::threadEntryPointCallback, this, "WebCore: LocalStorage"); 57 return m_threadID; 58} 59 60void* LocalStorageThread::threadEntryPointCallback(void* thread) 61{ 62 return static_cast<LocalStorageThread*>(thread)->threadEntryPoint(); 63} 64 65void* LocalStorageThread::threadEntryPoint() 66{ 67 ASSERT(!isMainThread()); 68 while (OwnPtr<LocalStorageTask> task = m_queue.waitForMessage()) 69 task->performTask(); 70 71 return 0; 72} 73 74void LocalStorageThread::scheduleTask(PassOwnPtr<LocalStorageTask> task) 75{ 76 ASSERT(isMainThread()); 77 ASSERT(!m_queue.killed() && m_threadID); 78 m_queue.append(task); 79} 80 81void LocalStorageThread::terminate() 82{ 83 ASSERT(isMainThread()); 84 ASSERT(!m_queue.killed() && m_threadID); 85 // Even in weird, exceptional cases, don't wait on a nonexistent thread to terminate. 86 if (!m_threadID) 87 return; 88 89 void* returnValue; 90 m_queue.append(LocalStorageTask::createTerminate(this)); 91 waitForThreadCompletion(m_threadID, &returnValue); 92 ASSERT(m_queue.killed()); 93 m_threadID = 0; 94} 95 96void LocalStorageThread::performTerminate() 97{ 98 ASSERT(!isMainThread()); 99 m_queue.kill(); 100} 101 102} 103 104#endif // ENABLE(DOM_STORAGE) 105