1/* 2 * Copyright (C) 2010, 2012 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 "SQLiteDatabaseTracker.h" 28 29#include <mutex> 30#include <wtf/NeverDestroyed.h> 31 32namespace WebCore { 33 34namespace SQLiteDatabaseTracker { 35 36static SQLiteDatabaseTrackerClient* s_staticSQLiteDatabaseTrackerClient = nullptr; 37static unsigned s_transactionInProgressCounter = 0; 38 39static std::mutex& transactionInProgressMutex() 40{ 41 static NeverDestroyed<std::mutex> tipMutex; 42 return tipMutex; 43} 44 45void setClient(SQLiteDatabaseTrackerClient* client) 46{ 47 ASSERT(client); 48 ASSERT(!s_staticSQLiteDatabaseTrackerClient || s_staticSQLiteDatabaseTrackerClient == client); 49 s_staticSQLiteDatabaseTrackerClient = client; 50} 51 52void incrementTransactionInProgressCount() 53{ 54 if (!s_staticSQLiteDatabaseTrackerClient) 55 return; 56 57 std::lock_guard<std::mutex> lock(transactionInProgressMutex()); 58 59 s_transactionInProgressCounter++; 60 if (s_transactionInProgressCounter == 1) 61 s_staticSQLiteDatabaseTrackerClient->willBeginFirstTransaction(); 62} 63 64void decrementTransactionInProgressCount() 65{ 66 if (!s_staticSQLiteDatabaseTrackerClient) 67 return; 68 69 std::lock_guard<std::mutex> lock(transactionInProgressMutex()); 70 71 ASSERT(s_transactionInProgressCounter); 72 s_transactionInProgressCounter--; 73 74 if (!s_transactionInProgressCounter) 75 s_staticSQLiteDatabaseTrackerClient->didFinishLastTransaction(); 76} 77 78#if !ASSERT_DISABLED 79bool hasTransactionInProgress() 80{ 81 return !s_staticSQLiteDatabaseTrackerClient || s_transactionInProgressCounter > 0; 82} 83#endif 84 85} // namespace SQLiteDatabaseTracker 86 87} // namespace WebCore 88