DXR is a code search and navigation tool aimed at making sense of large projects. It supports full-text and regex searches as well as structural queries.

Implementation

Mercurial (d38398e5144e)

VCS Links

LoadManager

LoadManagerSingleton

Macros

Line Code
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112
/* -*- Mode: C++; tab-width: 50; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
/* 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 _LOADMANAGER_H_
#define _LOADMANAGER_H_

#include "LoadMonitor.h"
#include "mozilla/StaticPtr.h"
#include "mozilla/TimeStamp.h"
#include "mozilla/Services.h"
#include "nsTArray.h"
#include "nsIObserver.h"

#include "webrtc/common_types.h"
#include "webrtc/call.h"
#include "webrtc/video/overuse_frame_detector.h"
extern mozilla::LazyLogModule gLoadManagerLog;

namespace mozilla {

class LoadManagerSingleton : public LoadNotificationCallback,
                             public webrtc::CPULoadStateCallbackInvoker,
                             public webrtc::CpuOveruseObserver,
                             public nsIObserver

{
public:
    static LoadManagerSingleton* Get();

    NS_DECL_THREADSAFE_ISUPPORTS
    NS_DECL_NSIOBSERVER

    // LoadNotificationCallback interface
    void LoadChanged(float aSystemLoad, float aProcessLoad) override;
    // CpuOveruseObserver interface
    // Called as soon as an overuse is detected.
    void OveruseDetected() override;
    // Called periodically when the system is not overused any longer.
    void NormalUsage() override;
    // CPULoadStateCallbackInvoker interface
    void AddObserver(webrtc::CPULoadStateObserver * aObserver) override;
    void RemoveObserver(webrtc::CPULoadStateObserver * aObserver) override;

private:
    LoadManagerSingleton(bool aEncoderOnly,
                         int aLoadMeasurementInterval,
                         int aAveragingMeasurements,
                         float aHighLoadThreshold,
                         float aLowLoadThreshold);
    ~LoadManagerSingleton();

    void LoadHasChanged(webrtc::CPULoadState aNewState);

    RefPtr<LoadMonitor> mLoadMonitor;

    // This protects access to the mObservers list, the current state, and
    // pretty much all the other members (below).
    Mutex mLock;
    nsTArray<webrtc::CPULoadStateObserver*> mObservers;
    webrtc::CPULoadState mCurrentState;
    TimeStamp mLastStateChange;
    float mTimeInState[static_cast<int>(webrtc::kLoadLast)];

    // Set when overuse was signaled to us, and hasn't been un-signaled yet.
    bool  mOveruseActive;
    float mLoadSum;
    int   mLoadSumMeasurements;
    // Load measurement settings
    int mLoadMeasurementInterval;
    int mAveragingMeasurements;
    float mHighLoadThreshold;
    float mLowLoadThreshold;

    static StaticRefPtr<LoadManagerSingleton> sSingleton;
};

class LoadManager final : public webrtc::CPULoadStateCallbackInvoker,
                          public webrtc::LoadObserver
{
public:
    explicit LoadManager(LoadManagerSingleton* aManager)
        : mManager(aManager)
    {}
    ~LoadManager() {}

    void AddObserver(webrtc::CPULoadStateObserver * aObserver) override
    {
        mManager->AddObserver(aObserver);
    }
    void RemoveObserver(webrtc::CPULoadStateObserver * aObserver) override
    {
        mManager->RemoveObserver(aObserver);
    }

    void OnLoadUpdate(webrtc::LoadObserver::Load load_state) override
    {
        if (load_state == webrtc::LoadObserver::kOveruse) {
            mManager->OveruseDetected();
        } else if (load_state == webrtc::LoadObserver::kUnderuse) {
            mManager->NormalUsage();
        }
    }

private:
    RefPtr<LoadManagerSingleton> mManager;
};

} //namespace

#endif /* _LOADMANAGER_H_ */