1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/xpcom/threads/nsMemoryPressure.cpp Wed Dec 31 06:09:35 2014 +0100 1.3 @@ -0,0 +1,53 @@ 1.4 +/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */ 1.5 +/* vim:set ts=2 sw=2 sts=2 et cindent: */ 1.6 +/* This Source Code Form is subject to the terms of the Mozilla Public 1.7 + * License, v. 2.0. If a copy of the MPL was not distributed with this 1.8 + * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ 1.9 + 1.10 +#include "nsMemoryPressure.h" 1.11 +#include "mozilla/Assertions.h" 1.12 +#include "mozilla/Atomics.h" 1.13 + 1.14 +#include "nsThreadUtils.h" 1.15 + 1.16 +using namespace mozilla; 1.17 + 1.18 +static Atomic<int32_t, Relaxed> sMemoryPressurePending; 1.19 +static_assert(MemPressure_None == 0, 1.20 + "Bad static initialization with the default constructor."); 1.21 + 1.22 +MemoryPressureState 1.23 +NS_GetPendingMemoryPressure() 1.24 +{ 1.25 + int32_t value = sMemoryPressurePending.exchange(MemPressure_None); 1.26 + return MemoryPressureState(value); 1.27 +} 1.28 + 1.29 +void 1.30 +NS_DispatchEventualMemoryPressure(MemoryPressureState state) 1.31 +{ 1.32 + /* 1.33 + * A new memory pressure event erases an ongoing memory pressure, but an 1.34 + * existing "new" memory pressure event takes precedence over a new "ongoing" 1.35 + * memory pressure event. 1.36 + */ 1.37 + switch (state) { 1.38 + case MemPressure_None: 1.39 + sMemoryPressurePending = MemPressure_None; 1.40 + break; 1.41 + case MemPressure_New: 1.42 + sMemoryPressurePending = MemPressure_New; 1.43 + break; 1.44 + case MemPressure_Ongoing: 1.45 + sMemoryPressurePending.compareExchange(MemPressure_None, MemPressure_Ongoing); 1.46 + break; 1.47 + } 1.48 +} 1.49 + 1.50 +nsresult 1.51 +NS_DispatchMemoryPressure(MemoryPressureState state) 1.52 +{ 1.53 + NS_DispatchEventualMemoryPressure(state); 1.54 + nsCOMPtr<nsIRunnable> event = new nsRunnable; 1.55 + return NS_DispatchToMainThread(event); 1.56 +}