| /* |
| * Copyright (C) 2020 The Android Open Source Project |
| * |
| * Licensed under the Apache License, Version 2.0 (the "License"); |
| * you may not use this file except in compliance with the License. |
| * You may obtain a copy of the License at |
| * |
| * http://www.apache.org/licenses/LICENSE-2.0 |
| * |
| * Unless required by applicable law or agreed to in writing, software |
| * distributed under the License is distributed on an "AS IS" BASIS, |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. |
| * See the License for the specific language governing permissions and |
| * limitations under the License. |
| */ |
| |
| #include "src/trace_processor/importers/proto/chrome_string_lookup.h" |
| |
| #include "perfetto/ext/base/utils.h" |
| #include "protos/perfetto/trace/track_event/chrome_legacy_ipc.pbzero.h" |
| #include "protos/perfetto/trace/track_event/chrome_process_descriptor.pbzero.h" |
| #include "protos/perfetto/trace/track_event/chrome_thread_descriptor.pbzero.h" |
| #include "src/trace_processor/storage/trace_storage.h" |
| |
| using ::perfetto::protos::pbzero::ChromeProcessDescriptor; |
| using ::perfetto::protos::pbzero::ChromeThreadDescriptor; |
| |
| namespace perfetto { |
| namespace trace_processor { |
| |
| namespace { |
| |
| struct ProcessName { |
| protos::pbzero::ChromeProcessDescriptor::ProcessType type; |
| const char* name; |
| }; |
| |
| constexpr ProcessName kProcessNames[] = { |
| {ChromeProcessDescriptor::PROCESS_UNSPECIFIED, nullptr}, |
| {ChromeProcessDescriptor::PROCESS_BROWSER, "Browser"}, |
| {ChromeProcessDescriptor::PROCESS_RENDERER, "Renderer"}, |
| {ChromeProcessDescriptor::PROCESS_UTILITY, "Utility"}, |
| {ChromeProcessDescriptor::PROCESS_ZYGOTE, "SandboxHelper"}, |
| {ChromeProcessDescriptor::PROCESS_GPU, "Gpu"}, |
| {ChromeProcessDescriptor::PROCESS_PPAPI_PLUGIN, "PpapiPlugin"}, |
| {ChromeProcessDescriptor::PROCESS_PPAPI_BROKER, "PpapiBroker"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_NETWORK, |
| "Service: network.mojom.NetworkService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_TRACING, |
| "Service: tracing.mojom.TracingService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_STORAGE, |
| "Service: storage.mojom.StorageService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_AUDIO, |
| "Service: audio.mojom.AudioService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_DATA_DECODER, |
| "Service: data_decoder.mojom.DataDecoderService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_UTIL_WIN, |
| "Service: chrome.mojom.UtilWin"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_PROXY_RESOLVER, |
| "Service: proxy_resolver.mojom.ProxyResolverFactory"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_CDM, |
| "Service: media.mojom.CdmService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_VIDEO_CAPTURE, |
| "Service: video_capture.mojom.VideoCaptureService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_UNZIPPER, |
| "Service: unzip.mojom.Unzipper"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_MIRRORING, |
| "Service: mirroring.mojom.MirroringService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_FILEPATCHER, |
| "Service: patch.mojom.FilePatcher"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_TTS, |
| "Service: chromeos.tts.mojom.TtsService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_PRINTING, |
| "Service: printing.mojom.PrintingService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_QUARANTINE, |
| "Service: quarantine.mojom.Quarantine"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_CROS_LOCALSEARCH, |
| "Service: chromeos.local_search_service.mojom.LocalSearchService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_CROS_ASSISTANT_AUDIO_DECODER, |
| "Service: chromeos.assistant.mojom.AssistantAudioDecoderFactory"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_FILEUTIL, |
| "Service: chrome.mojom.FileUtilService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_PRINTCOMPOSITOR, |
| "Service: printing.mojom.PrintCompositor"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_PAINTPREVIEW, |
| "Service: paint_preview.mojom.PaintPreviewCompositorCollection"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_SPEECHRECOGNITION, |
| "Service: media.mojom.SpeechRecognitionService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_XRDEVICE, |
| "Service: device.mojom.XRDeviceService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_READICON, |
| "Service: chrome.mojom.UtilReadIcon"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_LANGUAGEDETECTION, |
| "Service: language_detection.mojom.LanguageDetectionService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_SHARING, |
| "Service: sharing.mojom.Sharing"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_MEDIAPARSER, |
| "Service: chrome.mojom.MediaParserFactory"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_QRCODEGENERATOR, |
| "Service: qrcode_generator.mojom.QRCodeService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_PROFILEIMPORT, |
| "Service: chrome.mojom.ProfileImport"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_IME, |
| "Service: chromeos.ime.mojom.ImeService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_RECORDING, |
| "Service: recording.mojom.RecordingService"}, |
| {ChromeProcessDescriptor::PROCESS_SERVICE_SHAPEDETECTION, |
| "Service: shape_detection.mojom.ShapeDetectionService"}, |
| {ChromeProcessDescriptor::PROCESS_RENDERER_EXTENSION, "Extension Renderer"}, |
| }; |
| |
| struct ThreadName { |
| protos::pbzero::ChromeThreadDescriptor::ThreadType type; |
| const char* name; |
| }; |
| |
| constexpr ThreadName kThreadNames[] = { |
| {ChromeThreadDescriptor::THREAD_UNSPECIFIED, nullptr}, |
| {ChromeThreadDescriptor::THREAD_MAIN, "CrProcessMain"}, |
| {ChromeThreadDescriptor::THREAD_IO, "ChromeIOThread"}, |
| {ChromeThreadDescriptor::THREAD_NETWORK_SERVICE, "NetworkService"}, |
| {ChromeThreadDescriptor::THREAD_POOL_BG_WORKER, |
| "ThreadPoolBackgroundWorker&"}, |
| {ChromeThreadDescriptor::THREAD_POOL_FG_WORKER, |
| "ThreadPoolForegroundWorker&"}, |
| {ChromeThreadDescriptor::THREAD_POOL_BG_BLOCKING, |
| "ThreadPoolSingleThreadBackgroundBlocking&"}, |
| {ChromeThreadDescriptor::THREAD_POOL_FG_BLOCKING, |
| "ThreadPoolSingleThreadForegroundBlocking&"}, |
| {ChromeThreadDescriptor::THREAD_POOL_SERVICE, "ThreadPoolService"}, |
| {ChromeThreadDescriptor::THREAD_COMPOSITOR, "Compositor"}, |
| {ChromeThreadDescriptor::THREAD_VIZ_COMPOSITOR, "VizCompositorThread"}, |
| {ChromeThreadDescriptor::THREAD_COMPOSITOR_WORKER, "CompositorTileWorker&"}, |
| {ChromeThreadDescriptor::THREAD_SERVICE_WORKER, "ServiceWorkerThread&"}, |
| {ChromeThreadDescriptor::THREAD_MEMORY_INFRA, "MemoryInfra"}, |
| {ChromeThreadDescriptor::THREAD_SAMPLING_PROFILER, "StackSamplingProfiler"}, |
| |
| {ChromeThreadDescriptor::THREAD_BROWSER_MAIN, "CrBrowserMain"}, |
| {ChromeThreadDescriptor::THREAD_RENDERER_MAIN, "CrRendererMain"}, |
| {ChromeThreadDescriptor::THREAD_CHILD_IO, "Chrome_ChildIOThread"}, |
| {ChromeThreadDescriptor::THREAD_BROWSER_IO, "Chrome_IOThread"}, |
| {ChromeThreadDescriptor::THREAD_UTILITY_MAIN, "CrUtilityMain"}, |
| {ChromeThreadDescriptor::THREAD_GPU_MAIN, "CrGpuMain"}, |
| {ChromeThreadDescriptor::THREAD_CACHE_BLOCKFILE, "CacheThread_BlockFile"}, |
| {ChromeThreadDescriptor::ChromeThreadDescriptor::THREAD_MEDIA, "Media"}, |
| {ChromeThreadDescriptor::THREAD_AUDIO_OUTPUTDEVICE, "AudioOutputDevice"}, |
| {ChromeThreadDescriptor::THREAD_GPU_MEMORY, "GpuMemoryThread"}, |
| {ChromeThreadDescriptor::THREAD_GPU_VSYNC, "GpuVSyncThread"}, |
| {ChromeThreadDescriptor::THREAD_DXA_VIDEODECODER, "DXVAVideoDecoderThread"}, |
| {ChromeThreadDescriptor::THREAD_BROWSER_WATCHDOG, "BrowserWatchdog"}, |
| { |
| ChromeThreadDescriptor::THREAD_WEBRTC_NETWORK, |
| "WebRTC_Network", |
| }, |
| {ChromeThreadDescriptor::THREAD_WINDOW_OWNER, "Window owner thread"}, |
| {ChromeThreadDescriptor::THREAD_WEBRTC_SIGNALING, "WebRTC_Signaling"}, |
| {ChromeThreadDescriptor::THREAD_PPAPI_MAIN, "CrPPAPIMain"}, |
| {ChromeThreadDescriptor::THREAD_GPU_WATCHDOG, "GpuWatchdog"}, |
| {ChromeThreadDescriptor::THREAD_SWAPPER, "swapper"}, |
| {ChromeThreadDescriptor::THREAD_GAMEPAD_POLLING, "Gamepad polling thread"}, |
| {ChromeThreadDescriptor::THREAD_AUDIO_INPUTDEVICE, "AudioInputDevice"}, |
| {ChromeThreadDescriptor::THREAD_WEBRTC_WORKER, "WebRTC_Worker"}, |
| {ChromeThreadDescriptor::THREAD_WEBCRYPTO, "WebCrypto"}, |
| {ChromeThreadDescriptor::THREAD_DATABASE, "Database thread"}, |
| {ChromeThreadDescriptor::THREAD_PROXYRESOLVER, "Proxy Resolver"}, |
| {ChromeThreadDescriptor::THREAD_DEVTOOLSADB, "Chrome_DevToolsADBThread"}, |
| {ChromeThreadDescriptor::THREAD_NETWORKCONFIGWATCHER, |
| "NetworkConfigWatcher"}, |
| {ChromeThreadDescriptor::THREAD_WASAPI_RENDER, "wasapi_render_thread"}, |
| {ChromeThreadDescriptor::THREAD_LOADER_LOCK_SAMPLER, "LoaderLockSampler"}, |
| }; |
| |
| } // namespace |
| |
| ChromeStringLookup::ChromeStringLookup(TraceStorage* storage) { |
| for (uint32_t i = 0; i < base::ArraySize(kProcessNames); i++) { |
| chrome_process_name_ids_[kProcessNames[i].type] = |
| kProcessNames[i].name ? storage->InternString(kProcessNames[i].name) |
| : kNullStringId; |
| } |
| |
| for (uint32_t i = 0; i < base::ArraySize(kThreadNames); i++) { |
| chrome_thread_name_ids_[kThreadNames[i].type] = |
| kThreadNames[i].name ? storage->InternString(kThreadNames[i].name) |
| : kNullStringId; |
| } |
| } |
| |
| StringId ChromeStringLookup::GetProcessName(int32_t process_type) const { |
| auto process_name_it = chrome_process_name_ids_.find(process_type); |
| if (process_name_it != chrome_process_name_ids_.end()) |
| return process_name_it->second; |
| |
| PERFETTO_DLOG("GetProcessName error: Unknown Chrome process type %u", |
| process_type); |
| return kNullStringId; |
| } |
| |
| StringId ChromeStringLookup::GetThreadName(int32_t thread_type) const { |
| auto thread_name_it = chrome_thread_name_ids_.find(thread_type); |
| if (thread_name_it != chrome_thread_name_ids_.end()) |
| return thread_name_it->second; |
| |
| PERFETTO_DLOG("GetThreadName error: Unknown Chrome thread type %u", |
| thread_type); |
| return kNullStringId; |
| } |
| |
| } // namespace trace_processor |
| } // namespace perfetto |