Unreviewed, rolling out r234489.
[WebKit-https.git] / Source / WebCore / Modules / indexeddb / shared / IDBResourceIdentifier.cpp
1 /*
2  * Copyright (C) 2015 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. AND ITS CONTRIBUTORS ``AS IS''
14  * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
15  * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
16  * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
17  * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
18  * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
19  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
20  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
21  * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
22  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
23  * THE POSSIBILITY OF SUCH DAMAGE.
24  */
25
26 #include "config.h"
27 #include "IDBResourceIdentifier.h"
28
29 #if ENABLE(INDEXED_DATABASE)
30
31 #include "IDBConnectionToClient.h"
32 #include "IDBConnectionToServer.h"
33 #include "IDBRequest.h"
34 #include <wtf/MainThread.h>
35
36 namespace WebCore {
37
38 static uint64_t nextClientResourceNumber()
39 {
40     static std::atomic<uint64_t> currentNumber(1);
41     return currentNumber += 2;
42 }
43
44 static uint64_t nextServerResourceNumber()
45 {
46     ASSERT(isMainThread());
47     static uint64_t currentNumber = 0;
48     return currentNumber += 2;
49 }
50
51 IDBResourceIdentifier::IDBResourceIdentifier()
52 {
53 }
54
55 IDBResourceIdentifier::IDBResourceIdentifier(uint64_t connectionIdentifier, uint64_t resourceIdentifier)
56     : m_idbConnectionIdentifier(connectionIdentifier)
57     , m_resourceNumber(resourceIdentifier)
58 {
59 }
60
61 IDBResourceIdentifier::IDBResourceIdentifier(const IDBClient::IDBConnectionProxy& connectionProxy)
62     : m_idbConnectionIdentifier(connectionProxy.serverConnectionIdentifier())
63     , m_resourceNumber(nextClientResourceNumber())
64 {
65 }
66
67 IDBResourceIdentifier::IDBResourceIdentifier(const IDBClient::IDBConnectionProxy& connectionProxy, const IDBRequest& request)
68     : m_idbConnectionIdentifier(connectionProxy.serverConnectionIdentifier())
69     , m_resourceNumber(request.resourceIdentifier().m_resourceNumber)
70 {
71 }
72
73 IDBResourceIdentifier::IDBResourceIdentifier(const IDBServer::IDBConnectionToClient& connection)
74     : m_idbConnectionIdentifier(connection.identifier())
75     , m_resourceNumber(nextServerResourceNumber())
76 {
77 }
78
79 IDBResourceIdentifier IDBResourceIdentifier::isolatedCopy() const
80 {
81     return IDBResourceIdentifier(m_idbConnectionIdentifier, m_resourceNumber);
82 }
83
84 IDBResourceIdentifier IDBResourceIdentifier::emptyValue()
85 {
86     return IDBResourceIdentifier(0, 0);
87 }
88
89 IDBResourceIdentifier IDBResourceIdentifier::deletedValue()
90 {
91     return IDBResourceIdentifier(std::numeric_limits<uint64_t>::max(), std::numeric_limits<uint64_t>::max());
92 }
93
94 bool IDBResourceIdentifier::isHashTableDeletedValue() const
95 {
96     return m_idbConnectionIdentifier == std::numeric_limits<uint64_t>::max()
97         && m_resourceNumber == std::numeric_limits<uint64_t>::max();
98 }
99
100 #if !LOG_DISABLED
101 String IDBResourceIdentifier::loggingString() const
102 {
103     return String::format("<%" PRIu64", %" PRIu64">", m_idbConnectionIdentifier, m_resourceNumber);
104 }
105 #endif
106 } // namespace WebCore
107
108 #endif // ENABLE(INDEXED_DATABASE)