#pragma once #include "bsc/model/ProcessInfo.hpp" #include #include #include #include #include #include #include namespace bsc::proc { class ProcMon { public: std::optional inspect(std::uint32_t pid, bool checksums = false) const; std::optional cached(std::uint32_t pid, bool allow_recent_exit = true) const; std::vector recent_candidates(std::uint32_t uid, std::chrono::milliseconds max_age = std::chrono::milliseconds(5000), std::size_t limit = 8) const; std::vector recent_candidates_any(std::chrono::milliseconds max_age = std::chrono::milliseconds(1500), std::size_t limit = 8) const; void cache_process(const bsc::model::ProcessInfo& info) const; void invalidate(std::uint32_t pid) const; void note_fork(std::uint32_t child_pid, std::uint32_t parent_pid) const; void note_exec(std::uint32_t pid, bool checksums = false) const; void note_exit(std::uint32_t pid) const; private: struct CacheEntry { bsc::model::ProcessInfo info; bool has_checksums{false}; std::chrono::steady_clock::time_point updated_at{}; }; static std::optional inspect_procfs(std::uint32_t pid, bool checksums); mutable std::mutex cache_mutex_; mutable std::unordered_map cache_; mutable std::unordered_map exited_; }; } // namespace bsc::proc