forked from mirrors/gecko-dev
`const T&&` parameters don't have associated storage semantics defined for them. Previously they would end up as `StoreCopyPassByRRef`, which might even have been intentional. Forbid them, and change the one use case invoking it to a non-reference (becoming StoreCopyPassByConstLRef). Additionally, there are four optional storage classes that are never automatically selected. Two of these are never used, and a third is only used mistakenly (...ByLRef where only ...ByConstLRef is needed). Adjust the third's use-sites, and remove all three. The last, `StoreCopyPassByPtr`, has more of an argument to be kept: it's simpler to use (and, arguably, to understand) than its lambda-function equivalent when wrapping an XPCOM method that takes an [in]-pointer argument -- but it has only one use site in the entire codebase. Replace and remove it, as well. No functional changes. All deleted cases remain possible via lambda functions fed to NS_NewRunnableFunction. Differential Revision: https://phabricator.services.mozilla.com/D202173
123 lines
3.5 KiB
C++
123 lines
3.5 KiB
C++
/* 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 __nsWifiMonitor__
|
|
#define __nsWifiMonitor__
|
|
|
|
#include "nsIWifiMonitor.h"
|
|
#include "nsCOMPtr.h"
|
|
#include "nsProxyRelease.h"
|
|
#include "nsIThread.h"
|
|
#include "nsIRunnable.h"
|
|
#include "nsCOMArray.h"
|
|
#include "nsIWifiListener.h"
|
|
#include "mozilla/Atomics.h"
|
|
#include "mozilla/ReentrantMonitor.h"
|
|
#include "mozilla/Logging.h"
|
|
#include "nsIObserver.h"
|
|
#include "nsTArray.h"
|
|
#include "mozilla/Attributes.h"
|
|
#include "mozilla/Monitor.h"
|
|
#include "WifiScanner.h"
|
|
|
|
namespace mozilla {
|
|
class TestWifiMonitor;
|
|
}
|
|
|
|
extern mozilla::LazyLogModule gWifiMonitorLog;
|
|
|
|
class nsWifiAccessPoint;
|
|
|
|
// Period between scans when on mobile network.
|
|
#define WIFI_SCAN_INTERVAL_MS_PREF "network.wifi.scanning_period"
|
|
|
|
#ifdef XP_MACOSX
|
|
// Use a larger stack size for the wifi monitor thread of macOS, to
|
|
// accommodate Core WLAN making large stack allocations.
|
|
# define kMacOSWifiMonitorStackSize (512 * 1024)
|
|
#endif
|
|
|
|
struct WifiListenerHolder {
|
|
RefPtr<nsIWifiListener> mListener;
|
|
bool mShouldPoll;
|
|
bool mHasSentData = false;
|
|
|
|
explicit WifiListenerHolder(nsIWifiListener* aListener,
|
|
bool aShouldPoll = false)
|
|
: mListener(aListener), mShouldPoll(aShouldPoll) {}
|
|
};
|
|
|
|
class nsWifiMonitor final : public nsIWifiMonitor, public nsIObserver {
|
|
public:
|
|
NS_DECL_THREADSAFE_ISUPPORTS
|
|
NS_DECL_NSIWIFIMONITOR
|
|
NS_DECL_NSIOBSERVER
|
|
|
|
explicit nsWifiMonitor(
|
|
mozilla::UniquePtr<mozilla::WifiScanner>&& aScanner = nullptr);
|
|
|
|
private:
|
|
friend class mozilla::TestWifiMonitor;
|
|
|
|
~nsWifiMonitor();
|
|
|
|
nsresult DispatchScanToBackgroundThread(uint64_t aPollingId = 0,
|
|
uint32_t aWaitMs = 0);
|
|
|
|
void Scan(uint64_t aPollingId);
|
|
nsresult DoScan();
|
|
|
|
nsresult CallWifiListeners(
|
|
const nsTArray<RefPtr<nsIWifiAccessPoint>>& aAccessPoints,
|
|
bool aAccessPointsChanged);
|
|
|
|
nsresult PassErrorToWifiListeners(nsresult rv);
|
|
|
|
void Close();
|
|
|
|
bool IsBackgroundThread();
|
|
|
|
bool ShouldPoll() {
|
|
MOZ_ASSERT(!IsBackgroundThread());
|
|
return (mShouldPollForCurrentNetwork && !mListeners.IsEmpty()) ||
|
|
mNumPollingListeners > 0;
|
|
};
|
|
|
|
#ifdef ENABLE_TESTS
|
|
// Test-only function that confirms we "should" be polling. May be wrong
|
|
// if somehow the polling tasks are not set to run on the background
|
|
// thread.
|
|
bool IsPolling() { return mThread && mPollingId; }
|
|
#endif
|
|
|
|
// Main thread only.
|
|
nsCOMPtr<nsIThread> mThread;
|
|
|
|
// Main thread only.
|
|
nsTArray<WifiListenerHolder> mListeners;
|
|
|
|
// Background thread only.
|
|
mozilla::UniquePtr<mozilla::WifiScanner> mWifiScanner;
|
|
|
|
// Background thread only. Sorted.
|
|
nsTArray<RefPtr<nsIWifiAccessPoint>> mLastAccessPoints;
|
|
|
|
// Wifi-scanning requests may poll, meaning they will run repeatedly on
|
|
// a scheduled time period. If this value is 0 then polling is not running,
|
|
// otherwise, it indicates the "ID" of the polling that is running. if some
|
|
// other polling (with different ID) is running, it will stop, not iterate.
|
|
mozilla::Atomic<uint64_t> mPollingId;
|
|
|
|
// Number of current listeners that requested that the wifi scan poll
|
|
// periodically.
|
|
// Main thread only.
|
|
uint32_t mNumPollingListeners = 0;
|
|
|
|
// True if the current network type is one that requires polling
|
|
// (i.e. a "mobile" network type).
|
|
// Main thread only.
|
|
bool mShouldPollForCurrentNetwork = false;
|
|
};
|
|
|
|
#endif
|