brintos

brintos / llvm-project-archived public Read only

0
0
Text · 1.6 KiB · c3a430b Raw
51 lines · plain
1//===-- MemoryMonitorMacOSX.mm --------------------------------------------===//2//3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.4// See https://llvm.org/LICENSE.txt for license information.5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception6//7//===----------------------------------------------------------------------===//8 9#include "lldb/Host/MemoryMonitor.h"10#include <cassert>11#include <dispatch/dispatch.h>12 13using namespace lldb_private;14 15class MemoryMonitorMacOSX : public MemoryMonitor {16  using MemoryMonitor::MemoryMonitor;17  void Start() override {18    m_memory_pressure_source = dispatch_source_create(19        DISPATCH_SOURCE_TYPE_MEMORYPRESSURE, 0,20        DISPATCH_MEMORYPRESSURE_WARN | DISPATCH_MEMORYPRESSURE_CRITICAL,21        dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0));22 23    if (!m_memory_pressure_source)24      return;25 26    dispatch_source_set_event_handler(m_memory_pressure_source, ^{27      dispatch_source_memorypressure_flags_t pressureLevel =28          dispatch_source_get_data(m_memory_pressure_source);29      if (pressureLevel &30          (DISPATCH_MEMORYPRESSURE_WARN | DISPATCH_MEMORYPRESSURE_CRITICAL)) {31        m_callback();32      }33    });34    dispatch_activate(m_memory_pressure_source);35  }36 37  void Stop() override {38    if (m_memory_pressure_source) {39      dispatch_source_cancel(m_memory_pressure_source);40      dispatch_release(m_memory_pressure_source);41    }42  }43 44private:45  dispatch_source_t m_memory_pressure_source;46};47 48std::unique_ptr<MemoryMonitor> MemoryMonitor::Create(Callback callback) {49  return std::make_unique<MemoryMonitorMacOSX>(callback);50}51