diff --git a/mozilla/xpcom/base/nsIMemory.idl b/mozilla/xpcom/base/nsIMemory.idl index 83da99183e0..e5c04d361df 100644 --- a/mozilla/xpcom/base/nsIMemory.idl +++ b/mozilla/xpcom/base/nsIMemory.idl @@ -98,6 +98,13 @@ interface nsIMemory : nsISupports * @param obs - the observer to unregister */ void unregisterObserver(in nsIMemoryPressureObserver obs); + + /** + * This predicate can be used to determine if we're in a low-memory + * situation (what constitutes low-memory is platform dependent). This + * can be used to trigger the memory flushers. + */ + boolean isLowMemory(); }; /** diff --git a/mozilla/xpcom/base/nsMemoryImpl.cpp b/mozilla/xpcom/base/nsMemoryImpl.cpp index eb3fefa1227..b6c116cbe6e 100644 --- a/mozilla/xpcom/base/nsMemoryImpl.cpp +++ b/mozilla/xpcom/base/nsMemoryImpl.cpp @@ -24,6 +24,10 @@ #include "prmem.h" #include "nsIServiceManager.h" +#ifdef XP_PC +#include +#endif + NS_IMPL_THREADSAFE_ISUPPORTS1(nsMemoryImpl, nsIMemory) NS_METHOD @@ -46,7 +50,7 @@ nsMemoryImpl::Create(nsISupports* outer, const nsIID& aIID, void* *aInstancePtr) //////////////////////////////////////////////////////////////////////////////// // Define NS_OUT_OF_MEMORY_TESTER if you want to force memory failures -#ifdef DEBUG_warren +#ifdef DEBUG_xwarren #define NS_OUT_OF_MEMORY_TESTER #endif @@ -164,6 +168,20 @@ nsMemoryImpl::UnregisterObserver(nsIMemoryPressureObserver* obs) return mObservers->RemoveElement(obs); } +NS_IMETHODIMP +nsMemoryImpl::IsLowMemory(PRBool *result) +{ +#ifdef XP_PC + MEMORYSTATUS stat; + GlobalMemoryStatus(&stat); + *result = ((float)stat.dwAvailPageFile / stat.dwTotalPageFile) < 0.1; + return NS_OK; +#else + NS_NOTREACHED("nsMemoryImpl::IsLowMemory"); + return NS_ERROR_NOT_IMPLEMENTED; +#endif +} + nsresult nsMemoryImpl::FlushMemory(PRUint32 reason, PRSize size) {