1061da546Spatrick //===-- Genealogy.h ---------------------------------------------*- C++ -*-===//
2061da546Spatrick //-*-===//
3061da546Spatrick //
4061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
5061da546Spatrick // See https://llvm.org/LICENSE.txt for license information.
6061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
7061da546Spatrick //
8061da546Spatrick //===----------------------------------------------------------------------===//
9061da546Spatrick 
10*dda28197Spatrick #ifndef LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_GENEALOGY_H
11*dda28197Spatrick #define LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_GENEALOGY_H
12061da546Spatrick 
13061da546Spatrick #include <mach/task.h>
14061da546Spatrick #include <map>
15061da546Spatrick #include <pthread.h>
16061da546Spatrick #include <string>
17061da546Spatrick #include <vector>
18061da546Spatrick 
19061da546Spatrick #include "GenealogySPI.h"
20061da546Spatrick #include "MachThreadList.h"
21061da546Spatrick 
22061da546Spatrick class Genealogy {
23061da546Spatrick public:
24061da546Spatrick   Genealogy();
25061da546Spatrick 
~Genealogy()26061da546Spatrick   ~Genealogy() {}
27061da546Spatrick 
28061da546Spatrick   void Clear();
29061da546Spatrick 
30061da546Spatrick   struct Breadcrumb {
31061da546Spatrick     uint32_t breadcrumb_id;
32061da546Spatrick     uint64_t activity_id;
33061da546Spatrick     uint64_t timestamp;
34061da546Spatrick     std::string name;
35061da546Spatrick   };
36061da546Spatrick 
37061da546Spatrick   struct Activity {
38061da546Spatrick     uint64_t activity_start;
39061da546Spatrick     uint64_t activity_id;
40061da546Spatrick     uint64_t parent_id;
41061da546Spatrick     std::string activity_name;
42061da546Spatrick     std::string reason;
43061da546Spatrick   };
44061da546Spatrick 
45061da546Spatrick   struct Message {
46061da546Spatrick     uint64_t timestamp;
47061da546Spatrick     uint64_t activity_id;
48061da546Spatrick     uint64_t trace_id;
49061da546Spatrick     uint64_t thread;
50061da546Spatrick     uint8_t type;                // OS_TRACE_TYPE_RELEASE, OS_TRACE_TYPE_DEBUG,
51061da546Spatrick                                  // OS_TRACE_TYPE_ERROR, OS_TRACE_TYPE_FAULT
52061da546Spatrick     uint32_t process_info_index; // index # of the image uuid/file path, 0 means
53061da546Spatrick                                  // unknown
54061da546Spatrick     std::string message;
55061da546Spatrick   };
56061da546Spatrick 
57061da546Spatrick   typedef std::vector<Message> MessageList;
58061da546Spatrick   typedef std::vector<Breadcrumb> BreadcrumbList;
59061da546Spatrick   typedef std::vector<Activity> ActivityList;
60061da546Spatrick 
61061da546Spatrick   struct ThreadActivity {
62061da546Spatrick     Activity current_activity;
63061da546Spatrick     MessageList messages;
64061da546Spatrick     BreadcrumbList breadcrumbs; // should be 0 or 1 breadcrumbs; no more than 1
65061da546Spatrick                                 // BC for any given activity
66061da546Spatrick   };
67061da546Spatrick 
68061da546Spatrick   typedef std::shared_ptr<ThreadActivity> ThreadActivitySP;
69061da546Spatrick 
70061da546Spatrick   ThreadActivitySP GetGenealogyInfoForThread(pid_t pid, nub_thread_t tid,
71061da546Spatrick                                              const MachThreadList &thread_list,
72061da546Spatrick                                              task_t task, bool &timed_out);
73061da546Spatrick 
74061da546Spatrick   struct ProcessExecutableInfo {
75061da546Spatrick     std::string image_path;
76061da546Spatrick     uuid_t image_uuid;
77061da546Spatrick   };
78061da546Spatrick 
79061da546Spatrick   typedef std::shared_ptr<ProcessExecutableInfo> ProcessExecutableInfoSP;
80061da546Spatrick 
81061da546Spatrick   ProcessExecutableInfoSP GetProcessExecutableInfosAtIndex(size_t idx);
82061da546Spatrick 
83061da546Spatrick   uint32_t AddProcessExecutableInfo(ProcessExecutableInfoSP process_exe_info);
84061da546Spatrick 
85061da546Spatrick private:
86061da546Spatrick   void GetActivities(pid_t pid, const MachThreadList &thread_list, task_t task);
87061da546Spatrick 
88061da546Spatrick   // the spi we need to call into libtrace - look them up via dlsym at runtime
89061da546Spatrick   bool (*m_os_activity_diagnostic_for_pid)(pid_t pid, os_activity_t activity,
90061da546Spatrick                                            uint32_t flags,
91061da546Spatrick                                            os_diagnostic_block_t block);
92061da546Spatrick   void (*m_os_activity_iterate_processes)(
93061da546Spatrick       os_activity_process_list_t processes,
94061da546Spatrick       bool (^iterator)(os_activity_process_t process_info));
95061da546Spatrick   void (*m_os_activity_iterate_breadcrumbs)(
96061da546Spatrick       os_activity_process_t process_info,
97061da546Spatrick       bool (^iterator)(os_activity_breadcrumb_t breadcrumb));
98061da546Spatrick   void (*m_os_activity_iterate_messages)(
99061da546Spatrick       os_trace_message_list_t messages, os_activity_process_t process_info,
100061da546Spatrick       bool (^iterator)(os_trace_message_t tracemsg));
101061da546Spatrick   void (*m_os_activity_iterate_activities)(
102061da546Spatrick       os_activity_list_t activities, os_activity_process_t process_info,
103061da546Spatrick       bool (^iterator)(os_activity_entry_t activity));
104061da546Spatrick   uint8_t (*m_os_trace_get_type)(os_trace_message_t trace_msg);
105061da546Spatrick   char *(*m_os_trace_copy_formatted_message)(os_trace_message_t trace_msg);
106061da546Spatrick   os_activity_t (*m_os_activity_for_thread)(os_activity_process_t process,
107061da546Spatrick                                             uint64_t thread_id);
108061da546Spatrick   os_activity_t (*m_os_activity_for_task_thread)(task_t target,
109061da546Spatrick                                                  uint64_t thread_id);
110061da546Spatrick   os_trace_message_list_t (*m_os_activity_messages_for_thread)(
111061da546Spatrick       os_activity_process_t process, os_activity_t activity,
112061da546Spatrick       uint64_t thread_id);
113061da546Spatrick 
114061da546Spatrick   std::map<nub_thread_t, ThreadActivitySP> m_thread_activities;
115061da546Spatrick   std::vector<ProcessExecutableInfoSP> m_process_executable_infos;
116061da546Spatrick   bool m_diagnosticd_call_timed_out;
117061da546Spatrick };
118061da546Spatrick 
119*dda28197Spatrick #endif // LLDB_TOOLS_DEBUGSERVER_SOURCE_MACOSX_GENEALOGY_H
120