From ed3f44688a2e962102dfe910e868aefb6bdb2fd3 Mon Sep 17 00:00:00 2001 From: "vladimir%pobox.com" Date: Thu, 6 Mar 2008 01:28:36 +0000 Subject: [PATCH] b=392351, implement about:memory framework core, relading with forward-declaration victory; r=shaver,sr=bsdmedberg git-svn-id: svn://10.0.0.236/trunk@247155 18797224-902f-48f8-a5cc-f745e15eee43 --- mozilla/xpcom/base/Makefile.in | 4 +- mozilla/xpcom/base/nsIMemoryReporter.idl | 104 ++++++++++++++++++ .../xpcom/base/nsMemoryReporterManager.cpp | 52 +++++++++ mozilla/xpcom/base/nsMemoryReporterManager.h | 17 +++ mozilla/xpcom/build/nsXPCOMCIDInternal.h | 5 + mozilla/xpcom/build/nsXPComInit.cpp | 5 + 6 files changed, 186 insertions(+), 1 deletion(-) create mode 100644 mozilla/xpcom/base/nsIMemoryReporter.idl create mode 100644 mozilla/xpcom/base/nsMemoryReporterManager.cpp create mode 100644 mozilla/xpcom/base/nsMemoryReporterManager.h diff --git a/mozilla/xpcom/base/Makefile.in b/mozilla/xpcom/base/Makefile.in index ea8ef1fc311..4b95919ae92 100644 --- a/mozilla/xpcom/base/Makefile.in +++ b/mozilla/xpcom/base/Makefile.in @@ -66,6 +66,7 @@ CPPSRCS = \ nsSystemInfo.cpp \ nsCycleCollector.cpp \ nsStackWalk.cpp \ + nsMemoryReporterManager.cpp \ $(NULL) ifdef GC_LEAK_DETECTOR @@ -107,7 +108,7 @@ SDK_XPIDLSRCS = \ nsISupports.idl \ nsITraceRefcnt.idl \ nsIWeakReference.idl \ - nsrootidl.idl \ + nsrootidl.idl SDK_HEADERS = \ nsError.h \ @@ -126,6 +127,7 @@ XPIDLSRCS = \ nsIVersionComparator.idl \ nsIUUIDGenerator.idl \ nsIMutable.idl \ + nsIMemoryReporter.idl \ $(NULL) ifdef GC_LEAK_DETECTOR diff --git a/mozilla/xpcom/base/nsIMemoryReporter.idl b/mozilla/xpcom/base/nsIMemoryReporter.idl new file mode 100644 index 00000000000..3c797bbc9f8 --- /dev/null +++ b/mozilla/xpcom/base/nsIMemoryReporter.idl @@ -0,0 +1,104 @@ +/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ +/* ***** BEGIN LICENSE BLOCK ***** + * Version: MPL 1.1/GPL 2.0/LGPL 2.1 + * + * The contents of this file are subject to the Mozilla Public License Version + * 1.1 (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * http://www.mozilla.org/MPL/ + * + * Software distributed under the License is distributed on an "AS IS" basis, + * WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License + * for the specific language governing rights and limitations under the + * License. + * + * The Original Code is mozilla.org code. + * + * The Initial Developer of the Original Code is + * mozilla.org + * Portions created by the Initial Developer are Copyright (C) 2008 + * the Initial Developer. All Rights Reserved. + * + * Contributor(s): + * Vladimir Vukicevic (original author) + * + * Alternatively, the contents of this file may be used under the terms of + * either of the GNU General Public License Version 2 or later (the "GPL"), + * or the GNU Lesser General Public License Version 2.1 or later (the "LGPL"), + * in which case the provisions of the GPL or the LGPL are applicable instead + * of those above. If you wish to allow use of your version of this file only + * under the terms of either the GPL or the LGPL, and not to allow others to + * use your version of this file under the terms of the MPL, indicate your + * decision by deleting the provisions above and replace them with the notice + * and other provisions required by the GPL or the LGPL. If you do not delete + * the provisions above, a recipient may use your version of this file under + * the terms of any one of the MPL, the GPL or the LGPL. + * + * ***** END LICENSE BLOCK ***** */ + +#include "nsISupports.idl" + +interface nsISimpleEnumerator; + +[scriptable, uuid(d298b942-3e66-4cd3-9ff5-46abc69147a7)] +interface nsIMemoryReporter : nsISupports +{ + /* + * The path that this memory usage should be reported under. + * + * Normally "/"-delimited for organization. + */ + readonly attribute string path; + + /* + * A human-readable description of this memory usage report + */ + readonly attribute string description; + + /* + * The current amount of memory in use, as reported by this memory + * reporter. + */ + readonly attribute long long memoryUsed; +}; + +[scriptable, uuid(63fc8fbd-509b-4fdb-93b4-2e6caeeddab1)] +interface nsIMemoryReporterManager : nsISupports +{ + /* + * Return an enumerator of nsIMemoryReporters that are currently registered. + */ + nsISimpleEnumerator enumerateReporters (); + + /* + * Register the given nsIMemoryReporter. It is an error to register + * more than one reporter with the same path. After a reporter is + * registered, it will be available via enumerateReporters(). The + * Manager service will hold a strong reference to the given reporter. + */ + void registerReporter (in nsIMemoryReporter reporter); + + /* + * Unregister the given memory reporter. + */ + void unregisterReporter (in nsIMemoryReporter reporter); +}; + +%{C++ + +#define NS_MEMORY_REPORTER_IMPLEMENT(_classname,_path,_desc,_usageFunction,_dataptr) \ + class MemoryReporter_##_classname : public nsIMemoryReporter { \ + public: \ + NS_DECL_ISUPPORTS \ + NS_IMETHOD GetPath(char **memoryPath) { *memoryPath = strdup(_path); return NS_OK; } \ + NS_IMETHOD GetDescription(char **desc) { *desc = strdup(_desc); return NS_OK; } \ + NS_IMETHOD GetMemoryUsed(PRInt64 *memoryUsed) { *memoryUsed = _usageFunction(_dataptr); return NS_OK; } \ + }; \ + NS_IMPL_ISUPPORTS1(MemoryReporter_##_classname, nsIMemoryReporter) + +#define NS_MEMORY_REPORTER_NAME(_classname) MemoryReporter_##_classname + +NS_COM nsresult NS_RegisterMemoryReporter (nsIMemoryReporter *reporter); +NS_COM nsresult NS_UnregisterMemoryReporter (nsIMemoryReporter *reporter); + +%} diff --git a/mozilla/xpcom/base/nsMemoryReporterManager.cpp b/mozilla/xpcom/base/nsMemoryReporterManager.cpp new file mode 100644 index 00000000000..9c619fdf04c --- /dev/null +++ b/mozilla/xpcom/base/nsMemoryReporterManager.cpp @@ -0,0 +1,52 @@ + +#include "nsCOMPtr.h" +#include "nsServiceManagerUtils.h" +#include "nsMemoryReporterManager.h" + +#include "nsArrayEnumerator.h" + +NS_IMPL_ISUPPORTS1(nsMemoryReporterManager, nsIMemoryReporterManager) + +NS_IMETHODIMP +nsMemoryReporterManager::EnumerateReporters(nsISimpleEnumerator **result) +{ + return NS_NewArrayEnumerator(result, mReporters); +} + +NS_IMETHODIMP +nsMemoryReporterManager::RegisterReporter(nsIMemoryReporter *reporter) +{ + if (mReporters.IndexOf(reporter) != -1) + return NS_ERROR_FAILURE; + + mReporters.AppendObject(reporter); + return NS_OK; +} + +NS_IMETHODIMP +nsMemoryReporterManager::UnregisterReporter(nsIMemoryReporter *reporter) +{ + if (!mReporters.RemoveObject(reporter)) + return NS_ERROR_FAILURE; + + return NS_OK; +} + +nsresult +NS_RegisterMemoryReporter (nsIMemoryReporter *reporter) +{ + nsCOMPtr mgr = do_GetService("@mozilla.org/memory-reporter-manager;1"); + if (mgr == nsnull) + return NS_ERROR_FAILURE; + return mgr->RegisterReporter(reporter); +} + +nsresult +NS_UnregisterMemoryReporter (nsIMemoryReporter *reporter) +{ + nsCOMPtr mgr = do_GetService("@mozilla.org/memory-reporter-manager;1"); + if (mgr == nsnull) + return NS_ERROR_FAILURE; + return mgr->UnregisterReporter(reporter); +} + diff --git a/mozilla/xpcom/base/nsMemoryReporterManager.h b/mozilla/xpcom/base/nsMemoryReporterManager.h new file mode 100644 index 00000000000..98f00a70151 --- /dev/null +++ b/mozilla/xpcom/base/nsMemoryReporterManager.h @@ -0,0 +1,17 @@ + +#include "nsIMemoryReporter.h" +#include "nsCOMArray.h" + +class nsMemoryReporterManager : public nsIMemoryReporterManager +{ +public: + NS_DECL_ISUPPORTS + NS_DECL_NSIMEMORYREPORTERMANAGER + +private: + nsCOMArray mReporters; +}; + +#define NS_MEMORY_REPORTER_MANAGER_CID \ +{ 0xfb97e4f5, 0x32dd, 0x497a, \ +{ 0xba, 0xa2, 0x7d, 0x1e, 0x55, 0x7, 0x99, 0x10 } } diff --git a/mozilla/xpcom/build/nsXPCOMCIDInternal.h b/mozilla/xpcom/build/nsXPCOMCIDInternal.h index 5ad9845d21d..464443014c1 100644 --- a/mozilla/xpcom/build/nsXPCOMCIDInternal.h +++ b/mozilla/xpcom/build/nsXPCOMCIDInternal.h @@ -77,4 +77,9 @@ */ #define NS_XPCOMPROXY_CONTRACTID "@mozilla.org/xpcomproxy;1" +/** + * Memory reporter service CID + */ +#define NS_MEMORY_REPORTER_MANAGER_CONTRACTID "@mozilla.org/memory-reporter-manager;1" + #endif // nsXPCOMCIDInternal_h__ diff --git a/mozilla/xpcom/build/nsXPComInit.cpp b/mozilla/xpcom/build/nsXPComInit.cpp index de773b861bd..f1891769c9e 100644 --- a/mozilla/xpcom/build/nsXPComInit.cpp +++ b/mozilla/xpcom/build/nsXPComInit.cpp @@ -136,6 +136,7 @@ NS_DECL_CLASSINFO(nsStringInputStream) #endif #include "nsSystemInfo.h" +#include "nsMemoryReporterManager.h" #include @@ -229,6 +230,8 @@ NS_GENERIC_FACTORY_CONSTRUCTOR(nsMacUtilsImpl) NS_GENERIC_FACTORY_CONSTRUCTOR_INIT(nsSystemInfo, Init) +NS_GENERIC_FACTORY_CONSTRUCTOR(nsMemoryReporterManager) + static NS_METHOD nsThreadManagerGetSingleton(nsISupports* outer, const nsIID& aIID, @@ -444,6 +447,8 @@ static const nsModuleComponentInfo components[] = { #endif COMPONENT(SYSTEMINFO, nsSystemInfoConstructor), +#define NS_MEMORY_REPORTER_MANAGER_CLASSNAME "Memory Reporter Manager" + COMPONENT(MEMORY_REPORTER_MANAGER, nsMemoryReporterManagerConstructor), }; #undef COMPONENT