IDBResourceIdentifier.cpp [plain text]
#include "config.h"
#include "IDBResourceIdentifier.h"
#if ENABLE(INDEXED_DATABASE)
#include "IDBConnectionToClient.h"
#include "IDBConnectionToServer.h"
#include "IDBRequest.h"
#include <wtf/MainThread.h>
namespace WebCore {
static uint64_t nextClientResourceNumber()
{
static std::atomic<uint64_t> currentNumber(1);
return currentNumber += 2;
}
static uint64_t nextServerResourceNumber()
{
ASSERT(isMainThread());
static uint64_t currentNumber = 0;
return currentNumber += 2;
}
IDBResourceIdentifier::IDBResourceIdentifier()
{
}
IDBResourceIdentifier::IDBResourceIdentifier(uint64_t connectionIdentifier)
: m_idbConnectionIdentifier(connectionIdentifier)
, m_resourceNumber(nextClientResourceNumber())
{
}
IDBResourceIdentifier::IDBResourceIdentifier(uint64_t connectionIdentifier, uint64_t resourceIdentifier)
: m_idbConnectionIdentifier(connectionIdentifier)
, m_resourceNumber(resourceIdentifier)
{
}
IDBResourceIdentifier::IDBResourceIdentifier(const IDBClient::IDBConnectionProxy& connectionProxy)
: m_idbConnectionIdentifier(connectionProxy.serverConnectionIdentifier())
, m_resourceNumber(nextClientResourceNumber())
{
}
IDBResourceIdentifier::IDBResourceIdentifier(const IDBClient::IDBConnectionProxy& connectionProxy, const IDBRequest& request)
: m_idbConnectionIdentifier(connectionProxy.serverConnectionIdentifier())
, m_resourceNumber(request.resourceIdentifier().m_resourceNumber)
{
}
IDBResourceIdentifier::IDBResourceIdentifier(const IDBServer::IDBConnectionToClient& connection)
: m_idbConnectionIdentifier(connection.identifier())
, m_resourceNumber(nextServerResourceNumber())
{
}
IDBResourceIdentifier IDBResourceIdentifier::isolatedCopy() const
{
return IDBResourceIdentifier(m_idbConnectionIdentifier, m_resourceNumber);
}
IDBResourceIdentifier IDBResourceIdentifier::emptyValue()
{
return IDBResourceIdentifier(0, 0);
}
IDBResourceIdentifier IDBResourceIdentifier::deletedValue()
{
return IDBResourceIdentifier(std::numeric_limits<uint64_t>::max(), std::numeric_limits<uint64_t>::max());
}
bool IDBResourceIdentifier::isHashTableDeletedValue() const
{
return m_idbConnectionIdentifier == std::numeric_limits<uint64_t>::max()
&& m_resourceNumber == std::numeric_limits<uint64_t>::max();
}
#if !LOG_DISABLED
String IDBResourceIdentifier::loggingString() const
{
return String::format("<%" PRIu64", %" PRIu64">", m_idbConnectionIdentifier, m_resourceNumber);
}
#endif
}
#endif // ENABLE(INDEXED_DATABASE)