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:
aravind
2013-05-14 18:05:09 -07:00
commit de Sara Golemon
commit 7fbef94637
4 arquivos alterados com 32 adições e 1 exclusões
+12
Ver Arquivo
@@ -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;
}
+7 -1
Ver Arquivo
@@ -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;
}
}
+9
Ver Arquivo
@@ -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());
+4
Ver Arquivo
@@ -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);