summaryrefslogtreecommitdiffstats
path: root/dom/base/DOMArena.h
diff options
context:
space:
mode:
Diffstat (limited to 'dom/base/DOMArena.h')
-rw-r--r--dom/base/DOMArena.h59
1 files changed, 59 insertions, 0 deletions
diff --git a/dom/base/DOMArena.h b/dom/base/DOMArena.h
new file mode 100644
index 0000000000..3f6d3c680c
--- /dev/null
+++ b/dom/base/DOMArena.h
@@ -0,0 +1,59 @@
+/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*-
+ * vim: set ts=2 sw=2 et tw=78:
+ * This Source Code Form is subject to the terms of the Mozilla Public
+ * License, v. 2.0. If a copy of the MPL was not distributed with this
+ * file, You can obtain one at http://mozilla.org/MPL/2.0/.
+ */
+#ifndef DOM_Arena_h___
+#define DOM_Arena_h___
+#include "nsISupportsImpl.h"
+#include "mozmemory.h"
+
+#include "mozilla/mozalloc_oom.h" // for mozalloc_handle_oom
+
+#define NS_DECL_DOMARENA_DESTROY void Destroy(void);
+
+#define NS_IMPL_DOMARENA_DESTROY(class) \
+ void class ::Destroy(void) { \
+ if (StaticPrefs::dom_arena_allocator_enabled_AtStartup()) { \
+ RefPtr<nsNodeInfoManager> nim = OwnerDoc()->NodeInfoManager(); \
+ RefPtr<DOMArena> arena = \
+ HasFlag(NODE_KEEPS_DOMARENA) \
+ ? nsContentUtils::TakeEntryFromDOMArenaTable(this) \
+ : nullptr; \
+ this->~class(); \
+ MOZ_ASSERT(nim, "nsNodeInfoManager needs to be initialized"); \
+ nim->Free(this); \
+ } else { \
+ delete this; \
+ } \
+ }
+
+namespace mozilla::dom {
+
+class DOMArena {
+ public:
+ friend class DocGroup;
+ DOMArena() {
+ arena_params_t params;
+ params.mMaxDirtyIncreaseOverride = 7;
+ params.mFlags = ARENA_FLAG_THREAD_MAIN_THREAD_ONLY;
+ mArenaId = moz_create_arena_with_params(&params);
+ }
+
+ NS_INLINE_DECL_REFCOUNTING(DOMArena)
+
+ void* Allocate(size_t aSize) {
+ void* ret = moz_arena_malloc(mArenaId, aSize);
+ if (!ret) {
+ mozalloc_handle_oom(aSize);
+ }
+ return ret;
+ }
+
+ private:
+ ~DOMArena() { moz_dispose_arena(mArenaId); }
+ arena_id_t mArenaId;
+};
+} // namespace mozilla::dom
+#endif