forked from mirrors/gecko-dev
		
	 e58bb429df
			
		
	
	
		e58bb429df
		
	
	
	
	
		
			
			This patch factors the DOM related sizes in nsWindowSizes to its own struct, such that callers can easily acess DOM memory sizes. Differential Revision: https://phabricator.services.mozilla.com/D111317
		
			
				
	
	
		
			239 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			239 lines
		
	
	
	
		
			6.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| /* -*- Mode: C++; tab-width: 8; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
 | |
| /* vim: set ts=8 sts=2 et sw=2 tw=80: */
 | |
| /* 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 nsWindowSizes_h
 | |
| #define nsWindowSizes_h
 | |
| 
 | |
| #include "mozilla/Assertions.h"
 | |
| #include "mozilla/PodOperations.h"
 | |
| #include "mozilla/SizeOfState.h"
 | |
| 
 | |
| class nsTabSizes {
 | |
|  public:
 | |
|   enum Kind {
 | |
|     DOM,    // DOM stuff.
 | |
|     Style,  // Style stuff.
 | |
|     Other   // Everything else.
 | |
|   };
 | |
| 
 | |
|   nsTabSizes() : mDom(0), mStyle(0), mOther(0) {}
 | |
| 
 | |
|   void add(Kind kind, size_t n) {
 | |
|     switch (kind) {
 | |
|       case DOM:
 | |
|         mDom += n;
 | |
|         break;
 | |
|       case Style:
 | |
|         mStyle += n;
 | |
|         break;
 | |
|       case Other:
 | |
|         mOther += n;
 | |
|         break;
 | |
|       default:
 | |
|         MOZ_CRASH("bad nsTabSizes kind");
 | |
|     }
 | |
|   }
 | |
| 
 | |
|   size_t mDom;
 | |
|   size_t mStyle;
 | |
|   size_t mOther;
 | |
| };
 | |
| 
 | |
| #define ZERO_SIZE(kind, mSize) mSize(0),
 | |
| #define ADD_TO_TAB_SIZES(kind, mSize) aSizes->add(nsTabSizes::kind, mSize);
 | |
| #define ADD_TO_TOTAL_SIZE(kind, mSize) total += mSize;
 | |
| #define DECL_SIZE(kind, mSize) size_t mSize;
 | |
| 
 | |
| #define NS_STYLE_SIZES_FIELD(name_) mStyle##name_
 | |
| 
 | |
| struct nsStyleSizes {
 | |
|   nsStyleSizes()
 | |
|       :
 | |
| #define STYLE_STRUCT(name_) NS_STYLE_SIZES_FIELD(name_)(0),
 | |
| #include "nsStyleStructList.h"
 | |
| #undef STYLE_STRUCT
 | |
| 
 | |
|         dummy() {
 | |
|   }
 | |
| 
 | |
|   void addToTabSizes(nsTabSizes* aSizes) const {
 | |
| #define STYLE_STRUCT(name_) \
 | |
|   aSizes->add(nsTabSizes::Style, NS_STYLE_SIZES_FIELD(name_));
 | |
| #include "nsStyleStructList.h"
 | |
| #undef STYLE_STRUCT
 | |
|   }
 | |
| 
 | |
|   size_t getTotalSize() const {
 | |
|     size_t total = 0;
 | |
| 
 | |
| #define STYLE_STRUCT(name_) total += NS_STYLE_SIZES_FIELD(name_);
 | |
| #include "nsStyleStructList.h"
 | |
| #undef STYLE_STRUCT
 | |
| 
 | |
|     return total;
 | |
|   }
 | |
| 
 | |
| #define STYLE_STRUCT(name_) size_t NS_STYLE_SIZES_FIELD(name_);
 | |
| #include "nsStyleStructList.h"
 | |
| #undef STYLE_STRUCT
 | |
| 
 | |
|   // Present just to absorb the trailing comma in the constructor.
 | |
|   int dummy;
 | |
| };
 | |
| 
 | |
| #define NS_ARENA_SIZES_FIELD(classname) mArena##classname
 | |
| 
 | |
| struct nsArenaSizes {
 | |
|   nsArenaSizes()
 | |
|       :
 | |
| #define PRES_ARENA_OBJECT(name_) NS_ARENA_SIZES_FIELD(name_)(0),
 | |
| #define DISPLAY_LIST_ARENA_OBJECT(name_) PRES_ARENA_OBJECT(name_)
 | |
| #include "nsPresArenaObjectList.h"
 | |
| #include "nsDisplayListArenaTypes.h"
 | |
| #undef PRES_ARENA_OBJECT
 | |
| #undef DISPLAY_LIST_ARENA_OBJECT
 | |
|         dummy() {
 | |
|   }
 | |
| 
 | |
|   void addToTabSizes(nsTabSizes* aSizes) const {
 | |
| #define PRES_ARENA_OBJECT(name_) \
 | |
|   aSizes->add(nsTabSizes::Other, NS_ARENA_SIZES_FIELD(name_));
 | |
| #define DISPLAY_LIST_ARENA_OBJECT(name_) PRES_ARENA_OBJECT(name_)
 | |
| #include "nsPresArenaObjectList.h"
 | |
| #include "nsDisplayListArenaTypes.h"
 | |
| #undef PRES_ARENA_OBJECT
 | |
| #undef DISPLAY_LIST_ARENA_OBJECT
 | |
|   }
 | |
| 
 | |
|   size_t getTotalSize() const {
 | |
|     size_t total = 0;
 | |
| 
 | |
| #define PRES_ARENA_OBJECT(name_) total += NS_ARENA_SIZES_FIELD(name_);
 | |
| #define DISPLAY_LIST_ARENA_OBJECT(name_) PRES_ARENA_OBJECT(name_)
 | |
| #include "nsPresArenaObjectList.h"
 | |
| #include "nsDisplayListArenaTypes.h"
 | |
| #undef PRES_ARENA_OBJECT
 | |
| #undef DISPLAY_LIST_ARENA_OBJECT
 | |
| 
 | |
|     return total;
 | |
|   }
 | |
| 
 | |
| #define PRES_ARENA_OBJECT(name_) size_t NS_ARENA_SIZES_FIELD(name_);
 | |
| #define DISPLAY_LIST_ARENA_OBJECT(name_) PRES_ARENA_OBJECT(name_)
 | |
| #include "nsPresArenaObjectList.h"
 | |
| #include "nsDisplayListArenaTypes.h"
 | |
| #undef PRES_ARENA_OBJECT
 | |
| #undef DISPLAY_LIST_ARENA_OBJECT
 | |
| 
 | |
|   // Present just to absorb the trailing comma in the constructor.
 | |
|   int dummy;
 | |
| };
 | |
| 
 | |
| struct nsDOMSizes {
 | |
| #define FOR_EACH_SIZE(MACRO)                 \
 | |
|   MACRO(DOM, mDOMElementNodesSize)           \
 | |
|   MACRO(DOM, mDOMTextNodesSize)              \
 | |
|   MACRO(DOM, mDOMCDATANodesSize)             \
 | |
|   MACRO(DOM, mDOMCommentNodesSize)           \
 | |
|   MACRO(DOM, mDOMEventTargetsSize)           \
 | |
|   MACRO(DOM, mDOMMediaQueryLists)            \
 | |
|   MACRO(DOM, mDOMPerformanceEventEntries)    \
 | |
|   MACRO(DOM, mDOMPerformanceUserEntries)     \
 | |
|   MACRO(DOM, mDOMPerformanceResourceEntries) \
 | |
|   MACRO(DOM, mDOMResizeObserverControllerSize)
 | |
| 
 | |
|   nsDOMSizes() : FOR_EACH_SIZE(ZERO_SIZE) mDOMOtherSize(0) {}
 | |
| 
 | |
|   void addToTabSizes(nsTabSizes* aSizes) const {
 | |
|     FOR_EACH_SIZE(ADD_TO_TAB_SIZES)
 | |
|     aSizes->add(nsTabSizes::DOM, mDOMOtherSize);
 | |
|   }
 | |
| 
 | |
|   size_t getTotalSize() const {
 | |
|     size_t total = 0;
 | |
|     FOR_EACH_SIZE(ADD_TO_TOTAL_SIZE)
 | |
|     total += mDOMOtherSize;
 | |
|     return total;
 | |
|   }
 | |
| 
 | |
|   FOR_EACH_SIZE(DECL_SIZE)
 | |
| 
 | |
|   size_t mDOMOtherSize;
 | |
| #undef FOR_EACH_SIZE
 | |
| };
 | |
| 
 | |
| class nsWindowSizes {
 | |
| #define FOR_EACH_SIZE(MACRO)                                 \
 | |
|   MACRO(Style, mLayoutStyleSheetsSize)                       \
 | |
|   MACRO(Style, mLayoutShadowDomStyleSheetsSize)              \
 | |
|   MACRO(Style, mLayoutShadowDomAuthorStyles)                 \
 | |
|   MACRO(Other, mLayoutPresShellSize)                         \
 | |
|   MACRO(Other, mLayoutRetainedDisplayListSize)               \
 | |
|   MACRO(Style, mLayoutStyleSetsStylistRuleTree)              \
 | |
|   MACRO(Style, mLayoutStyleSetsStylistElementAndPseudosMaps) \
 | |
|   MACRO(Style, mLayoutStyleSetsStylistInvalidationMap)       \
 | |
|   MACRO(Style, mLayoutStyleSetsStylistRevalidationSelectors) \
 | |
|   MACRO(Style, mLayoutStyleSetsStylistOther)                 \
 | |
|   MACRO(Style, mLayoutStyleSetsOther)                        \
 | |
|   MACRO(Style, mLayoutElementDataObjects)                    \
 | |
|   MACRO(Other, mLayoutTextRunsSize)                          \
 | |
|   MACRO(Other, mLayoutPresContextSize)                       \
 | |
|   MACRO(Other, mLayoutFramePropertiesSize)                   \
 | |
|   MACRO(Style, mLayoutComputedValuesDom)                     \
 | |
|   MACRO(Style, mLayoutComputedValuesNonDom)                  \
 | |
|   MACRO(Style, mLayoutComputedValuesVisited)                 \
 | |
|   MACRO(Style, mLayoutSvgMappedDeclarations)                 \
 | |
|   MACRO(Other, mPropertyTablesSize)                          \
 | |
|   MACRO(Other, mBindingsSize)
 | |
| 
 | |
|  public:
 | |
|   explicit nsWindowSizes(mozilla::SizeOfState& aState)
 | |
|       : FOR_EACH_SIZE(ZERO_SIZE) mDOMEventTargetsCount(0),
 | |
|         mDOMEventListenersCount(0),
 | |
|         mArenaSizes(),
 | |
|         mStyleSizes(),
 | |
|         mState(aState) {}
 | |
| 
 | |
|   void addToTabSizes(nsTabSizes* aSizes) const {
 | |
|     FOR_EACH_SIZE(ADD_TO_TAB_SIZES)
 | |
|     mDOMSizes.addToTabSizes(aSizes);
 | |
|     mArenaSizes.addToTabSizes(aSizes);
 | |
|     mStyleSizes.addToTabSizes(aSizes);
 | |
|   }
 | |
| 
 | |
|   size_t getTotalSize() const {
 | |
|     size_t total = 0;
 | |
| 
 | |
|     FOR_EACH_SIZE(ADD_TO_TOTAL_SIZE)
 | |
|     total += mDOMSizes.getTotalSize();
 | |
|     total += mArenaSizes.getTotalSize();
 | |
|     total += mStyleSizes.getTotalSize();
 | |
| 
 | |
|     return total;
 | |
|   }
 | |
| 
 | |
|   FOR_EACH_SIZE(DECL_SIZE);
 | |
| 
 | |
|   uint32_t mDOMEventTargetsCount;
 | |
|   uint32_t mDOMEventListenersCount;
 | |
| 
 | |
|   nsDOMSizes mDOMSizes;
 | |
| 
 | |
|   nsArenaSizes mArenaSizes;
 | |
| 
 | |
|   nsStyleSizes mStyleSizes;
 | |
| 
 | |
|   mozilla::SizeOfState& mState;
 | |
| 
 | |
| #undef FOR_EACH_SIZE
 | |
| };
 | |
| 
 | |
| #undef ZERO_SIZE
 | |
| #undef ADD_TO_TAB_SIZES
 | |
| #undef ADD_TO_TOTAL_SIZE
 | |
| #undef DECL_SIZE
 | |
| 
 | |
| #endif  // nsWindowSizes_h
 |