bool ConcurrentTableSharedStore::cas(const String& key, int64_t old, int64_t val) { bool success = false; ConditionalReadLock l(m_lock, !apcExtension::ConcurrentTableLockFree || m_lockingFlag); StoreValue *sval; { Map::accessor acc; if (m_vars.find(acc, tagStringData(key.get()))) { sval = &acc->second; if (!sval->expired() && get_int64_value(sval) == old) { APCHandle *var = construct(Variant(val)); sval->var->unreferenceRoot(); sval->var = var; success = true; } } } return success; }
bool ConcurrentTableSharedStore::cas(CStrRef key, int64 old, int64 val) { bool success = false; ConditionalReadLock l(m_lock, !RuntimeOption::ApcConcurrentTableLockFree || m_lockingFlag); StoreValue *sval; { Map::accessor acc; if (m_vars.find(acc, key.data())) { sval = &acc->second; if (!sval->expired() && get_int64_value(sval) == old) { SharedVariant *var = construct(Variant(val)); sval->var->decRef(); sval->var = var; success = true; log_apc(std_apc_cas); } } } return success; }
int64_t ConcurrentTableSharedStore::inc(const String& key, int64_t step, bool &found) { found = false; int64_t ret = 0; ConditionalReadLock l(m_lock, !apcExtension::ConcurrentTableLockFree || m_lockingFlag); StoreValue *sval; { Map::accessor acc; if (m_vars.find(acc, tagStringData(key.get()))) { sval = &acc->second; if (!sval->expired()) { ret = get_int64_value(sval) + step; APCHandle *svar = construct(Variant(ret)); sval->var->unreferenceRoot(); sval->var = svar; found = true; } } } return ret; }
int64 ConcurrentTableSharedStore::inc(CStrRef key, int64 step, bool &found) { found = false; int64 ret = 0; ConditionalReadLock l(m_lock, !RuntimeOption::ApcConcurrentTableLockFree || m_lockingFlag); StoreValue *sval; { Map::accessor acc; if (m_vars.find(acc, key.data())) { sval = &acc->second; if (!sval->expired()) { ret = get_int64_value(sval) + step; SharedVariant *svar = construct(Variant(ret)); sval->var->decRef(); sval->var = svar; found = true; log_apc(std_apc_hit); } } } return ret; }