//===-- MemoryMonitorMacOSX.mm --------------------------------------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// #include "lldb/Host/MemoryMonitor.h" #include #include using namespace lldb_private; class MemoryMonitorMacOSX : public MemoryMonitor { using MemoryMonitor::MemoryMonitor; void Start() override { m_memory_pressure_source = dispatch_source_create( DISPATCH_SOURCE_TYPE_MEMORYPRESSURE, 0, DISPATCH_MEMORYPRESSURE_WARN | DISPATCH_MEMORYPRESSURE_CRITICAL, dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0)); if (!m_memory_pressure_source) return; dispatch_source_set_event_handler(m_memory_pressure_source, ^{ dispatch_source_memorypressure_flags_t pressureLevel = dispatch_source_get_data(m_memory_pressure_source); if (pressureLevel & (DISPATCH_MEMORYPRESSURE_WARN | DISPATCH_MEMORYPRESSURE_CRITICAL)) { m_callback(); } }); dispatch_activate(m_memory_pressure_source); } void Stop() override { if (m_memory_pressure_source) { dispatch_source_cancel(m_memory_pressure_source); dispatch_release(m_memory_pressure_source); } } private: dispatch_source_t m_memory_pressure_source; }; std::unique_ptr MemoryMonitor::Create(Callback callback) { return std::make_unique(callback); }