Bug 1824627 - Consider to have a larger cache for MiscContainer, r=emilio

Differential Revision: https://phabricator.services.mozilla.com/D173650
This commit is contained in:
Olli Pettay 2023-03-27 20:06:57 +00:00
Родитель 1b7fb51ea3
Коммит eee8167688
3 изменённых файлов: 28 добавлений и 17 удалений

Просмотреть файл

@ -37,17 +37,27 @@
using namespace mozilla;
constexpr uint32_t kMiscContainerCacheSize = 128;
static void* gMiscContainerCache[kMiscContainerCacheSize];
static uint32_t gMiscContainerCount = 0;
/* static */
MiscContainer* nsAttrValue::AllocMiscContainer() {
MOZ_ASSERT(NS_IsMainThread());
MiscContainer* cont = nullptr;
std::swap(cont, sMiscContainerCache);
if (cont) {
return new (cont) MiscContainer;
static_assert(sizeof(gMiscContainerCache) <= 1024);
static_assert(sizeof(MiscContainer) <= 32);
// Allocate MiscContainer objects in batches to improve performance.
if (gMiscContainerCount == 0) {
for (; gMiscContainerCount < kMiscContainerCacheSize;
++gMiscContainerCount) {
gMiscContainerCache[gMiscContainerCount] =
moz_xmalloc(sizeof(MiscContainer));
}
}
return new MiscContainer;
return new (gMiscContainerCache[--gMiscContainerCount]) MiscContainer();
}
/* static */
@ -57,12 +67,14 @@ void nsAttrValue::DeallocMiscContainer(MiscContainer* aCont) {
return;
}
if (!sMiscContainerCache) {
aCont->~MiscContainer();
sMiscContainerCache = aCont;
} else {
delete aCont;
aCont->~MiscContainer();
if (gMiscContainerCount < kMiscContainerCacheSize) {
gMiscContainerCache[gMiscContainerCount++] = aCont;
return;
}
free(aCont);
}
bool MiscContainer::GetString(nsAString& aString) const {
@ -134,7 +146,6 @@ void MiscContainer::Evict() {
}
nsTArray<const nsAttrValue::EnumTable*>* nsAttrValue::sEnumTableArray = nullptr;
MiscContainer* nsAttrValue::sMiscContainerCache = nullptr;
nsAttrValue::nsAttrValue() : mBits(0) {}
@ -169,11 +180,11 @@ void nsAttrValue::Shutdown() {
MOZ_ASSERT(NS_IsMainThread());
delete sEnumTableArray;
sEnumTableArray = nullptr;
// The MiscContainer pointed to by sMiscContainerCache has already
// be destructed so `delete sMiscContainerCache` is
// dangerous. Invoke `operator delete` to free the memory.
::operator delete(sMiscContainerCache);
sMiscContainerCache = nullptr;
for (uint32_t i = 0; i < gMiscContainerCount; ++i) {
free(gMiscContainerCache[i]);
}
gMiscContainerCount = 0;
}
void nsAttrValue::Reset() {

Просмотреть файл

@ -560,7 +560,6 @@ class nsAttrValue {
static void DeallocMiscContainer(MiscContainer* aCont);
static nsTArray<const EnumTable*>* sEnumTableArray;
static MiscContainer* sMiscContainerCache;
/**
* Helper for ParseHTMLDimension and ParseNonzeroHTMLDimension.

Просмотреть файл

@ -268,6 +268,7 @@ allowlist-types = [
"mozilla::MediumFeaturesChangedResult",
"nsAttrName",
"nsAttrValue",
"MiscContainer",
"nscolor",
"nsChangeHint",
"nsCSSCounterDesc",