In modern C++, static constexpr member variables are automatically inline (aka weak) so the template trick is not needed. This also avoid duplication and reduces the amount of parsed code. No impact on generated binary (actually: smaller debuginfo, close to identical binary). Differential Revision: https://phabricator.services.mozilla.com/D247825
130 lines
3.6 KiB
C++
130 lines
3.6 KiB
C++
/* -*- Mode: C++; tab-width: 2; indent-tabs-mode: nil; c-basic-offset: 2 -*- */
|
|
/* 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 mozilla_net_Tickler_h
|
|
#define mozilla_net_Tickler_h
|
|
|
|
// The tickler sends a regular 0 byte UDP heartbeat out to a
|
|
// particular address for a short time after it has been touched. This
|
|
// is used on some mobile wifi chipsets to mitigate Power Save Polling
|
|
// (PSP) Mode when we are anticipating a response packet
|
|
// soon. Typically PSP adds 100ms of latency to a read event because
|
|
// the packet delivery is not triggered until the 802.11 beacon is
|
|
// delivered to the host (100ms is the standard Access Point
|
|
// configuration for the beacon interval.) Requesting a frequent
|
|
// transmission and getting a CTS frame from the AP at least that
|
|
// frequently allows for low latency receives when we have reason to
|
|
// expect them (e.g a SYN-ACK).
|
|
//
|
|
// The tickler is used to allow RTT based phases of web transport to
|
|
// complete quickly when on wifi - ARP, DNS, TCP handshake, SSL
|
|
// handshake, HTTP headers, and the TCP slow start phase. The
|
|
// transaction is given up to 400 miliseconds by default to get
|
|
// through those phases before the tickler is disabled.
|
|
//
|
|
// The tickler only applies to wifi on mobile right now. Hopefully it
|
|
// can also be restricted to particular handset models in the future.
|
|
|
|
#if defined(ANDROID) && !defined(MOZ_PROXY_BYPASS_PROTECTION)
|
|
# define MOZ_USE_WIFI_TICKLER
|
|
#endif
|
|
|
|
#include "mozilla/Attributes.h"
|
|
#include "nsISupports.h"
|
|
#include <stdint.h>
|
|
|
|
#ifdef MOZ_USE_WIFI_TICKLER
|
|
# include "mozilla/Mutex.h"
|
|
# include "mozilla/TimeStamp.h"
|
|
# include "nsISupports.h"
|
|
# include "nsIThread.h"
|
|
# include "nsITimer.h"
|
|
# include "nsWeakReference.h"
|
|
# include "prio.h"
|
|
|
|
class nsIPrefBranch;
|
|
#endif
|
|
|
|
namespace mozilla {
|
|
namespace net {
|
|
|
|
#ifdef MOZ_USE_WIFI_TICKLER
|
|
|
|
// 8f769ed6-207c-4af9-9f7e-9e832da3754e
|
|
# define NS_TICKLER_IID \
|
|
{0x8f769ed6, \
|
|
0x207c, \
|
|
0x4af9, \
|
|
{0x9f, 0x7e, 0x9e, 0x83, 0x2d, 0xa3, 0x75, 0x4e}}
|
|
|
|
class Tickler final : public nsSupportsWeakReference {
|
|
public:
|
|
NS_DECL_THREADSAFE_ISUPPORTS
|
|
NS_INLINE_DECL_STATIC_IID(NS_TICKLER_IID)
|
|
|
|
// These methods are main thread only
|
|
Tickler();
|
|
void Cancel();
|
|
nsresult Init();
|
|
void SetIPV4Address(uint32_t address);
|
|
void SetIPV4Port(uint16_t port);
|
|
|
|
// Tickle the tickler to (re-)start the activity.
|
|
// May call from any thread
|
|
void Tickle();
|
|
|
|
private:
|
|
~Tickler();
|
|
|
|
friend class TicklerTimer;
|
|
Mutex mLock MOZ_UNANNOTATED;
|
|
nsCOMPtr<nsIThread> mThread;
|
|
nsCOMPtr<nsITimer> mTimer;
|
|
nsCOMPtr<nsIPrefBranch> mPrefs;
|
|
|
|
bool mActive;
|
|
bool mCanceled;
|
|
bool mEnabled;
|
|
uint32_t mDelay;
|
|
TimeDuration mDuration;
|
|
PRFileDesc* mFD;
|
|
|
|
TimeStamp mLastTickle;
|
|
PRNetAddr mAddr;
|
|
|
|
// These functions may be called from any thread
|
|
void PostCheckTickler();
|
|
void MaybeStartTickler();
|
|
void MaybeStartTicklerUnlocked();
|
|
|
|
// Tickler thread only
|
|
void CheckTickler();
|
|
void StartTickler();
|
|
void StopTickler();
|
|
};
|
|
|
|
#else // not defined MOZ_USE_WIFI_TICKLER
|
|
|
|
class Tickler final : public nsISupports {
|
|
~Tickler() = default;
|
|
|
|
public:
|
|
NS_DECL_THREADSAFE_ISUPPORTS
|
|
|
|
Tickler() = default;
|
|
nsresult Init() { return NS_ERROR_NOT_IMPLEMENTED; }
|
|
void Cancel() {}
|
|
void SetIPV4Address(uint32_t) {};
|
|
void SetIPV4Port(uint16_t) {}
|
|
void Tickle() {}
|
|
};
|
|
|
|
#endif // defined MOZ_USE_WIFI_TICKLER
|
|
|
|
} // namespace net
|
|
} // namespace mozilla
|
|
|
|
#endif // mozilla_net_Tickler_h
|