blob: b4c0dd593b432812d92e8d658132f2239caf9cdf [file] [log] [blame]
// Copyright 2020 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef SRC_DEVELOPER_MEMORY_MONITOR_PRESSURE_OBSERVER_H_
#define SRC_DEVELOPER_MEMORY_MONITOR_PRESSURE_OBSERVER_H_
#include <lib/async-loop/cpp/loop.h>
#include <lib/async-loop/default.h>
#include <lib/async/cpp/task.h>
#include <lib/zx/event.h>
#include <zircon/types.h>
#include <array>
#include <memory>
#include <string>
namespace monitor {
namespace test {
class PressureObserverUnitTest;
class PressureNotifierUnitTest;
} // namespace test
enum Level : size_t {
kCritical = 0,
kWarning,
kNormal,
kNumLevels,
};
static constexpr size_t kNameLength = 10;
static constexpr std::array<char[kNameLength], Level::kNumLevels + 1> kLevelNames = {
"CRITICAL", "WARNING", "NORMAL", "UNSET"};
class PressureNotifier;
class PressureObserver {
public:
explicit PressureObserver(bool watch_for_changes, PressureNotifier* notifier = nullptr);
PressureObserver(const PressureObserver&) = delete;
PressureObserver& operator=(const PressureObserver&) = delete;
Level GetCurrentLevel() const { return level_; }
private:
zx_status_t InitMemPressureEvents();
void WatchForChanges();
void WaitOnLevelChange();
void OnLevelChanged(zx_handle_t handle);
std::atomic<Level> level_ = Level::kNumLevels;
std::array<zx::event, Level::kNumLevels> events_;
std::array<zx_wait_item_t, Level::kNumLevels> wait_items_;
async::TaskClosureMethod<PressureObserver, &PressureObserver::WatchForChanges> watch_task_{this};
async::Loop loop_ = async::Loop(&kAsyncLoopConfigNoAttachToCurrentThread);
PressureNotifier* const notifier_;
friend class test::PressureObserverUnitTest;
friend class test::PressureNotifierUnitTest;
};
} // namespace monitor
#endif // SRC_DEVELOPER_MEMORY_MONITOR_PRESSURE_OBSERVER_H_