SharedStringHashTableReadOnly.cpp [plain text]
#include "config.h"
#include "SharedStringHashTableReadOnly.h"
#include "SharedMemory.h"
namespace WebKit {
using namespace WebCore;
#if !ASSERT_DISABLED
static inline bool isPowerOf2(unsigned v)
{
return !(v & (v - 1)) && v;
}
#endif
static inline unsigned doubleHash(unsigned key)
{
key = ~key + (key >> 23);
key ^= (key << 12);
key ^= (key >> 7);
key ^= (key << 2);
key ^= (key >> 20);
return key;
}
SharedStringHashTableReadOnly::SharedStringHashTableReadOnly()
{
}
SharedStringHashTableReadOnly::~SharedStringHashTableReadOnly()
{
}
void SharedStringHashTableReadOnly::setSharedMemory(RefPtr<SharedMemory>&& sharedMemory)
{
m_sharedMemory = WTFMove(sharedMemory);
if (m_sharedMemory) {
ASSERT(!(m_sharedMemory->size() % sizeof(SharedStringHash)));
m_table = static_cast<SharedStringHash*>(m_sharedMemory->data());
m_tableSize = m_sharedMemory->size() / sizeof(SharedStringHash);
ASSERT(isPowerOf2(m_tableSize));
m_tableSizeMask = m_tableSize - 1;
} else {
m_table = nullptr;
m_tableSize = 0;
m_tableSizeMask = 0;
}
}
bool SharedStringHashTableReadOnly::contains(SharedStringHash sharedStringHash) const
{
auto* slot = findSlot(sharedStringHash);
return slot && *slot;
}
SharedStringHash* SharedStringHashTableReadOnly::findSlot(SharedStringHash sharedStringHash) const
{
if (!m_sharedMemory)
return nullptr;
int k = 0;
SharedStringHash* table = m_table;
int sizeMask = m_tableSizeMask;
unsigned h = static_cast<unsigned>(sharedStringHash);
int i = h & sizeMask;
SharedStringHash* entry;
while (1) {
entry = table + i;
if (!*entry)
return entry;
if (*entry == sharedStringHash)
return entry;
if (!k)
k = 1 | doubleHash(h);
i = (i + k) & sizeMask;
}
}
}