xref: /aosp_15_r20/external/perfetto/src/trace_processor/importers/proto/chrome_string_lookup.cc (revision 6dbdd20afdafa5e3ca9b8809fa73465d530080dc)
1 /*
2  * Copyright (C) 2020 The Android Open Source Project
3  *
4  * Licensed under the Apache License, Version 2.0 (the "License");
5  * you may not use this file except in compliance with the License.
6  * You may obtain a copy of the License at
7  *
8  *      http://www.apache.org/licenses/LICENSE-2.0
9  *
10  * Unless required by applicable law or agreed to in writing, software
11  * distributed under the License is distributed on an "AS IS" BASIS,
12  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13  * See the License for the specific language governing permissions and
14  * limitations under the License.
15  */
16 
17 #include "src/trace_processor/importers/proto/chrome_string_lookup.h"
18 
19 #include "perfetto/ext/base/utils.h"
20 #include "protos/perfetto/trace/track_event/chrome_legacy_ipc.pbzero.h"
21 #include "protos/perfetto/trace/track_event/chrome_process_descriptor.pbzero.h"
22 #include "protos/perfetto/trace/track_event/chrome_thread_descriptor.pbzero.h"
23 #include "src/trace_processor/storage/trace_storage.h"
24 
25 using ::perfetto::protos::pbzero::ChromeProcessDescriptor;
26 using ::perfetto::protos::pbzero::ChromeThreadDescriptor;
27 
28 namespace perfetto {
29 namespace trace_processor {
30 
31 namespace {
32 
33 struct ProcessName {
34   protos::pbzero::ChromeProcessDescriptor::ProcessType type;
35   const char* name;
36 };
37 
38 constexpr ProcessName kProcessNames[] = {
39     {ChromeProcessDescriptor::PROCESS_UNSPECIFIED, nullptr},
40     {ChromeProcessDescriptor::PROCESS_BROWSER, "Browser"},
41     {ChromeProcessDescriptor::PROCESS_RENDERER, "Renderer"},
42     {ChromeProcessDescriptor::PROCESS_UTILITY, "Utility"},
43     {ChromeProcessDescriptor::PROCESS_ZYGOTE, "SandboxHelper"},
44     {ChromeProcessDescriptor::PROCESS_GPU, "Gpu"},
45     {ChromeProcessDescriptor::PROCESS_PPAPI_PLUGIN, "PpapiPlugin"},
46     {ChromeProcessDescriptor::PROCESS_PPAPI_BROKER, "PpapiBroker"},
47     {ChromeProcessDescriptor::PROCESS_SERVICE_NETWORK,
48      "Service: network.mojom.NetworkService"},
49     {ChromeProcessDescriptor::PROCESS_SERVICE_TRACING,
50      "Service: tracing.mojom.TracingService"},
51     {ChromeProcessDescriptor::PROCESS_SERVICE_STORAGE,
52      "Service: storage.mojom.StorageService"},
53     {ChromeProcessDescriptor::PROCESS_SERVICE_AUDIO,
54      "Service: audio.mojom.AudioService"},
55     {ChromeProcessDescriptor::PROCESS_SERVICE_DATA_DECODER,
56      "Service: data_decoder.mojom.DataDecoderService"},
57     {ChromeProcessDescriptor::PROCESS_SERVICE_UTIL_WIN,
58      "Service: chrome.mojom.UtilWin"},
59     {ChromeProcessDescriptor::PROCESS_SERVICE_PROXY_RESOLVER,
60      "Service: proxy_resolver.mojom.ProxyResolverFactory"},
61     {ChromeProcessDescriptor::PROCESS_SERVICE_CDM,
62      "Service: media.mojom.CdmServiceBroker"},
63     {ChromeProcessDescriptor::PROCESS_SERVICE_MEDIA_FOUNDATION,
64      "Service: media.mojom.MediaFoundationServiceBroker"},
65     {ChromeProcessDescriptor::PROCESS_SERVICE_VIDEO_CAPTURE,
66      "Service: video_capture.mojom.VideoCaptureService"},
67     {ChromeProcessDescriptor::PROCESS_SERVICE_UNZIPPER,
68      "Service: unzip.mojom.Unzipper"},
69     {ChromeProcessDescriptor::PROCESS_SERVICE_MIRRORING,
70      "Service: mirroring.mojom.MirroringService"},
71     {ChromeProcessDescriptor::PROCESS_SERVICE_FILEPATCHER,
72      "Service: patch.mojom.FilePatcher"},
73     {ChromeProcessDescriptor::PROCESS_SERVICE_TTS,
74      "Service: chromeos.tts.mojom.TtsService"},
75     {ChromeProcessDescriptor::PROCESS_SERVICE_PRINTING,
76      "Service: printing.mojom.PrintingService"},
77     {ChromeProcessDescriptor::PROCESS_SERVICE_QUARANTINE,
78      "Service: quarantine.mojom.Quarantine"},
79     {ChromeProcessDescriptor::PROCESS_SERVICE_CROS_LOCALSEARCH,
80      "Service: chromeos.local_search_service.mojom.LocalSearchService"},
81     {ChromeProcessDescriptor::PROCESS_SERVICE_CROS_ASSISTANT_AUDIO_DECODER,
82      "Service: chromeos.assistant.mojom.AssistantAudioDecoderFactory"},
83     {ChromeProcessDescriptor::PROCESS_SERVICE_FILEUTIL,
84      "Service: chrome.mojom.FileUtilService"},
85     {ChromeProcessDescriptor::PROCESS_SERVICE_PRINTCOMPOSITOR,
86      "Service: printing.mojom.PrintCompositor"},
87     {ChromeProcessDescriptor::PROCESS_SERVICE_PAINTPREVIEW,
88      "Service: paint_preview.mojom.PaintPreviewCompositorCollection"},
89     {ChromeProcessDescriptor::PROCESS_SERVICE_SPEECHRECOGNITION,
90      "Service: media.mojom.SpeechRecognitionService"},
91     {ChromeProcessDescriptor::PROCESS_SERVICE_XRDEVICE,
92      "Service: device.mojom.XRDeviceService"},
93     {ChromeProcessDescriptor::PROCESS_SERVICE_READICON,
94      "Service: chrome.mojom.UtilReadIcon"},
95     {ChromeProcessDescriptor::PROCESS_SERVICE_LANGUAGEDETECTION,
96      "Service: language_detection.mojom.LanguageDetectionService"},
97     {ChromeProcessDescriptor::PROCESS_SERVICE_SHARING,
98      "Service: sharing.mojom.Sharing"},
99     {ChromeProcessDescriptor::PROCESS_SERVICE_MEDIAPARSER,
100      "Service: chrome.mojom.MediaParserFactory"},
101     {ChromeProcessDescriptor::PROCESS_SERVICE_QRCODEGENERATOR,
102      "Service: qrcode_generator.mojom.QRCodeService"},
103     {ChromeProcessDescriptor::PROCESS_SERVICE_PROFILEIMPORT,
104      "Service: chrome.mojom.ProfileImport"},
105     {ChromeProcessDescriptor::PROCESS_SERVICE_IME,
106      "Service: chromeos.ime.mojom.ImeService"},
107     {ChromeProcessDescriptor::PROCESS_SERVICE_RECORDING,
108      "Service: recording.mojom.RecordingService"},
109     {ChromeProcessDescriptor::PROCESS_SERVICE_SHAPEDETECTION,
110      "Service: shape_detection.mojom.ShapeDetectionService"},
111     {ChromeProcessDescriptor::PROCESS_RENDERER_EXTENSION, "Extension Renderer"},
112 };
113 
114 struct ThreadName {
115   protos::pbzero::ChromeThreadDescriptor::ThreadType type;
116   const char* name;
117 };
118 
119 constexpr ThreadName kThreadNames[] = {
120     {ChromeThreadDescriptor::THREAD_UNSPECIFIED, nullptr},
121     {ChromeThreadDescriptor::THREAD_MAIN, "CrProcessMain"},
122     {ChromeThreadDescriptor::THREAD_IO, "ChromeIOThread"},
123     {ChromeThreadDescriptor::THREAD_NETWORK_SERVICE, "NetworkService"},
124     {ChromeThreadDescriptor::THREAD_POOL_BG_WORKER,
125      "ThreadPoolBackgroundWorker&"},
126     {ChromeThreadDescriptor::THREAD_POOL_FG_WORKER,
127      "ThreadPoolForegroundWorker&"},
128     {ChromeThreadDescriptor::THREAD_POOL_BG_BLOCKING,
129      "ThreadPoolSingleThreadBackgroundBlocking&"},
130     {ChromeThreadDescriptor::THREAD_POOL_FG_BLOCKING,
131      "ThreadPoolSingleThreadForegroundBlocking&"},
132     {ChromeThreadDescriptor::THREAD_POOL_SERVICE, "ThreadPoolService"},
133     {ChromeThreadDescriptor::THREAD_COMPOSITOR, "Compositor"},
134     {ChromeThreadDescriptor::THREAD_VIZ_COMPOSITOR, "VizCompositorThread"},
135     {ChromeThreadDescriptor::THREAD_COMPOSITOR_WORKER, "CompositorTileWorker&"},
136     {ChromeThreadDescriptor::THREAD_SERVICE_WORKER, "ServiceWorkerThread&"},
137     {ChromeThreadDescriptor::THREAD_MEMORY_INFRA, "MemoryInfra"},
138     {ChromeThreadDescriptor::THREAD_SAMPLING_PROFILER, "StackSamplingProfiler"},
139 
140     {ChromeThreadDescriptor::THREAD_BROWSER_MAIN, "CrBrowserMain"},
141     {ChromeThreadDescriptor::THREAD_RENDERER_MAIN, "CrRendererMain"},
142     {ChromeThreadDescriptor::THREAD_CHILD_IO, "Chrome_ChildIOThread"},
143     {ChromeThreadDescriptor::THREAD_BROWSER_IO, "Chrome_IOThread"},
144     {ChromeThreadDescriptor::THREAD_UTILITY_MAIN, "CrUtilityMain"},
145     {ChromeThreadDescriptor::THREAD_GPU_MAIN, "CrGpuMain"},
146     {ChromeThreadDescriptor::THREAD_CACHE_BLOCKFILE, "CacheThread_BlockFile"},
147     {ChromeThreadDescriptor::ChromeThreadDescriptor::THREAD_MEDIA, "Media"},
148     {ChromeThreadDescriptor::THREAD_AUDIO_OUTPUTDEVICE, "AudioOutputDevice"},
149     {ChromeThreadDescriptor::THREAD_GPU_MEMORY, "GpuMemoryThread"},
150     {ChromeThreadDescriptor::THREAD_GPU_VSYNC, "GpuVSyncThread"},
151     {ChromeThreadDescriptor::THREAD_DXA_VIDEODECODER, "DXVAVideoDecoderThread"},
152     {ChromeThreadDescriptor::THREAD_BROWSER_WATCHDOG, "BrowserWatchdog"},
153     {
154         ChromeThreadDescriptor::THREAD_WEBRTC_NETWORK,
155         "WebRTC_Network",
156     },
157     {ChromeThreadDescriptor::THREAD_WINDOW_OWNER, "Window owner thread"},
158     {ChromeThreadDescriptor::THREAD_WEBRTC_SIGNALING, "WebRTC_Signaling"},
159     {ChromeThreadDescriptor::THREAD_PPAPI_MAIN, "CrPPAPIMain"},
160     {ChromeThreadDescriptor::THREAD_GPU_WATCHDOG, "GpuWatchdog"},
161     {ChromeThreadDescriptor::THREAD_SWAPPER, "swapper"},
162     {ChromeThreadDescriptor::THREAD_GAMEPAD_POLLING, "Gamepad polling thread"},
163     {ChromeThreadDescriptor::THREAD_AUDIO_INPUTDEVICE, "AudioInputDevice"},
164     {ChromeThreadDescriptor::THREAD_WEBRTC_WORKER, "WebRTC_Worker"},
165     {ChromeThreadDescriptor::THREAD_WEBCRYPTO, "WebCrypto"},
166     {ChromeThreadDescriptor::THREAD_DATABASE, "Database thread"},
167     {ChromeThreadDescriptor::THREAD_PROXYRESOLVER, "Proxy Resolver"},
168     {ChromeThreadDescriptor::THREAD_DEVTOOLSADB, "Chrome_DevToolsADBThread"},
169     {ChromeThreadDescriptor::THREAD_NETWORKCONFIGWATCHER,
170      "NetworkConfigWatcher"},
171     {ChromeThreadDescriptor::THREAD_WASAPI_RENDER, "wasapi_render_thread"},
172     {ChromeThreadDescriptor::THREAD_LOADER_LOCK_SAMPLER, "LoaderLockSampler"},
173     {ChromeThreadDescriptor::THREAD_COMPOSITOR_GPU, "CompositorGpuThread"},
174 };
175 
176 }  // namespace
177 
ChromeStringLookup(TraceStorage * storage)178 ChromeStringLookup::ChromeStringLookup(TraceStorage* storage) {
179   for (uint32_t i = 0; i < base::ArraySize(kProcessNames); i++) {
180     chrome_process_name_ids_[kProcessNames[i].type] =
181         kProcessNames[i].name ? storage->InternString(kProcessNames[i].name)
182                               : kNullStringId;
183   }
184 
185   for (uint32_t i = 0; i < base::ArraySize(kThreadNames); i++) {
186     chrome_thread_name_ids_[kThreadNames[i].type] =
187         kThreadNames[i].name ? storage->InternString(kThreadNames[i].name)
188                              : kNullStringId;
189   }
190 }
191 
GetProcessName(int32_t process_type) const192 StringId ChromeStringLookup::GetProcessName(int32_t process_type) const {
193   auto process_name_it = chrome_process_name_ids_.find(process_type);
194   if (process_name_it != chrome_process_name_ids_.end())
195     return process_name_it->second;
196 
197   PERFETTO_DLOG("GetProcessName error: Unknown Chrome process type %u",
198                 process_type);
199   return kNullStringId;
200 }
201 
GetThreadName(int32_t thread_type) const202 StringId ChromeStringLookup::GetThreadName(int32_t thread_type) const {
203   auto thread_name_it = chrome_thread_name_ids_.find(thread_type);
204   if (thread_name_it != chrome_thread_name_ids_.end())
205     return thread_name_it->second;
206 
207   PERFETTO_DLOG("GetThreadName error: Unknown Chrome thread type %u",
208                 thread_type);
209   return kNullStringId;
210 }
211 
212 }  // namespace trace_processor
213 }  // namespace perfetto
214