Optimize SharedVariant refcounting
Elide refcounting for non-refcounted TVs in SharedVariant. Additionally for apc_store, if TV is a static string, use the static version insted of the given one.
Esse commit está contido em:
@@ -48,6 +48,12 @@ SharedVariant::SharedVariant(CVarRef source, bool serialized,
|
||||
break;
|
||||
}
|
||||
case KindOfStaticString:
|
||||
{
|
||||
if (serialized) goto StringCase;
|
||||
m_data.str = source.getStringData();
|
||||
break;
|
||||
}
|
||||
StringCase:
|
||||
case KindOfString:
|
||||
{
|
||||
String s = source.toString();
|
||||
@@ -57,6 +63,12 @@ SharedVariant::SharedVariant(CVarRef source, bool serialized,
|
||||
// for unserialization.
|
||||
s = apc_reserialize(s);
|
||||
}
|
||||
StringData* st = StringData::LookupStaticString(s.get());
|
||||
if (st) {
|
||||
m_data.str = st;
|
||||
m_type = KindOfStaticString;
|
||||
break;
|
||||
}
|
||||
m_data.str = s->copy(true);
|
||||
break;
|
||||
}
|
||||
|
||||
@@ -66,12 +66,18 @@ public:
|
||||
}
|
||||
|
||||
void incRef() {
|
||||
assert(IS_REFCOUNTED_TYPE(m_type));
|
||||
atomic_inc(m_count);
|
||||
}
|
||||
|
||||
void decRef() {
|
||||
assert(m_count);
|
||||
if (atomic_dec(m_count) == 0) {
|
||||
if (IS_REFCOUNTED_TYPE(m_type)) {
|
||||
if (atomic_dec(m_count) == 0) {
|
||||
delete this;
|
||||
}
|
||||
} else {
|
||||
assert(m_count == 1);
|
||||
delete this;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -103,6 +103,15 @@ StringData *StringData::GetStaticString(const StringData *str) {
|
||||
return const_cast<StringData*>(pair.first->first);
|
||||
}
|
||||
|
||||
StringData *StringData::LookupStaticString(const StringData *str) {
|
||||
if (UNLIKELY(!s_stringDataMap)) return nullptr;
|
||||
StringDataMap::const_iterator it = s_stringDataMap->find(str);
|
||||
if (it != s_stringDataMap->end()) {
|
||||
return const_cast<StringData*>(it->first);
|
||||
}
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
StringData* StringData::GetStaticString(const String& str) {
|
||||
assert(!str.isNull());
|
||||
return GetStaticString(str.get());
|
||||
|
||||
@@ -352,6 +352,10 @@ public:
|
||||
static StringData *GetStaticString(const String& str);
|
||||
static StringData *GetStaticString(const char* str);
|
||||
static StringData *GetStaticString(char c);
|
||||
|
||||
/* check if a static string exists that is the same as str
|
||||
* and if so, return it. Else, return nullptr. */
|
||||
static StringData *LookupStaticString(const StringData* str);
|
||||
static size_t GetStaticStringCount();
|
||||
static uint32_t GetCnsHandle(const StringData* cnsName);
|
||||
static uint32_t DefCnsHandle(const StringData* cnsName, bool persistent);
|
||||
|
||||
Referência em uma Nova Issue
Bloquear um usuário