//===-- Activity.h -----------------------------------------------*- C++ //-*-===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// #ifndef __Genealogy_h__ #define __Genealogy_h__ #include #include #include #include #include #include "GenealogySPI.h" #include "MachThreadList.h" class Genealogy { public: Genealogy(); ~Genealogy() {} void Clear(); struct Breadcrumb { uint32_t breadcrumb_id; uint64_t activity_id; uint64_t timestamp; std::string name; }; struct Activity { uint64_t activity_start; uint64_t activity_id; uint64_t parent_id; std::string activity_name; std::string reason; }; struct Message { uint64_t timestamp; uint64_t activity_id; uint64_t trace_id; uint64_t thread; uint8_t type; // OS_TRACE_TYPE_RELEASE, OS_TRACE_TYPE_DEBUG, // OS_TRACE_TYPE_ERROR, OS_TRACE_TYPE_FAULT uint32_t process_info_index; // index # of the image uuid/file path, 0 means // unknown std::string message; }; typedef std::vector MessageList; typedef std::vector BreadcrumbList; typedef std::vector ActivityList; struct ThreadActivity { Activity current_activity; MessageList messages; BreadcrumbList breadcrumbs; // should be 0 or 1 breadcrumbs; no more than 1 // BC for any given activity }; typedef std::shared_ptr ThreadActivitySP; ThreadActivitySP GetGenealogyInfoForThread(pid_t pid, nub_thread_t tid, const MachThreadList &thread_list, task_t task, bool &timed_out); struct ProcessExecutableInfo { std::string image_path; uuid_t image_uuid; }; typedef std::shared_ptr ProcessExecutableInfoSP; ProcessExecutableInfoSP GetProcessExecutableInfosAtIndex(size_t idx); uint32_t AddProcessExecutableInfo(ProcessExecutableInfoSP process_exe_info); private: void GetActivities(pid_t pid, const MachThreadList &thread_list, task_t task); // the spi we need to call into libtrace - look them up via dlsym at runtime bool (*m_os_activity_diagnostic_for_pid)(pid_t pid, os_activity_t activity, uint32_t flags, os_diagnostic_block_t block); void (*m_os_activity_iterate_processes)( os_activity_process_list_t processes, bool (^iterator)(os_activity_process_t process_info)); void (*m_os_activity_iterate_breadcrumbs)( os_activity_process_t process_info, bool (^iterator)(os_activity_breadcrumb_t breadcrumb)); void (*m_os_activity_iterate_messages)( os_trace_message_list_t messages, os_activity_process_t process_info, bool (^iterator)(os_trace_message_t tracemsg)); void (*m_os_activity_iterate_activities)( os_activity_list_t activities, os_activity_process_t process_info, bool (^iterator)(os_activity_entry_t activity)); uint8_t (*m_os_trace_get_type)(os_trace_message_t trace_msg); char *(*m_os_trace_copy_formatted_message)(os_trace_message_t trace_msg); os_activity_t (*m_os_activity_for_thread)(os_activity_process_t process, uint64_t thread_id); os_activity_t (*m_os_activity_for_task_thread)(task_t target, uint64_t thread_id); os_trace_message_list_t (*m_os_activity_messages_for_thread)( os_activity_process_t process, os_activity_t activity, uint64_t thread_id); std::map m_thread_activities; std::vector m_process_executable_infos; bool m_diagnosticd_call_timed_out; }; #endif // __Genealogy_h__