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 34 namespace WebCore { 35 36 PassOwnPtr<LocalStorageThread> LocalStorageThread::create() 37 { 38 return new LocalStorageThread; 39 } 40 41 LocalStorageThread::LocalStorageThread() 42 : m_threadID(0) 43 { 44 } 45 46 LocalStorageThread::~LocalStorageThread() 47 { 48 ASSERT(isMainThread()); 49 ASSERT(!m_threadID); 50 } 51 52 bool 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 60 void* LocalStorageThread::threadEntryPointCallback(void* thread) 61 { 62 return static_cast<LocalStorageThread*>(thread)->threadEntryPoint(); 63 } 64 65 void* LocalStorageThread::threadEntryPoint() 66 { 67 ASSERT(!isMainThread()); 68 while (OwnPtr<LocalStorageTask> task = m_queue.waitForMessage()) 69 task->performTask(); 70 71 return 0; 72 } 73 74 void LocalStorageThread::scheduleTask(PassOwnPtr<LocalStorageTask> task) 75 { 76 ASSERT(isMainThread()); 77 ASSERT(!m_queue.killed() && m_threadID); 78 m_queue.append(task); 79 } 80 81 void 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 96 void LocalStorageThread::performTerminate() 97 { 98 ASSERT(!isMainThread()); 99 m_queue.kill(); 100 } 101 102 } 103 104 #endif // ENABLE(DOM_STORAGE) 105