1 // Copyright 2022 The Chromium Authors
2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file.
5 #include "chrome/browser/process_singleton_internal.h"
7 #include "base/metrics/histogram_macros.h"
8 #include "base/notreached.h"
9 #include "base/trace_event/base_tracing.h"
10 #include "base/tracing/protos/chrome_track_event.pbzero.h"
11 #include "build/build_config.h"
17 #define CASE(enum_value) \
18 case ProcessSingleton::enum_value: \
19 return perfetto::protos::pbzero::ProcessSingleton::enum_value
21 perfetto::protos::pbzero::ProcessSingleton::RemoteProcessInteractionResult
22 ToProtoEnum(ProcessSingleton::RemoteProcessInteractionResult result) {
24 CASE(TERMINATE_SUCCEEDED);
25 CASE(TERMINATE_FAILED);
26 CASE(REMOTE_PROCESS_NOT_FOUND);
28 CASE(TERMINATE_WAIT_TIMEOUT);
29 CASE(RUNNING_PROCESS_NOTIFY_ERROR);
30 #elif BUILDFLAG(IS_POSIX)
31 CASE(TERMINATE_NOT_ENOUGH_PERMISSIONS);
32 CASE(REMOTE_PROCESS_SHUTTING_DOWN);
33 CASE(PROFILE_UNLOCKED);
34 CASE(PROFILE_UNLOCKED_BEFORE_KILL);
35 CASE(SAME_BROWSER_INSTANCE);
36 CASE(SAME_BROWSER_INSTANCE_BEFORE_KILL);
37 CASE(FAILED_TO_EXTRACT_PID);
38 CASE(INVALID_LOCK_FILE);
39 CASE(ORPHANED_LOCK_FILE);
41 CASE(USER_REFUSED_TERMINATION);
42 case ProcessSingleton::REMOTE_PROCESS_INTERACTION_RESULT_COUNT:
44 return perfetto::protos::pbzero::ProcessSingleton::
45 INTERACTION_RESULT_UNSPECIFIED;
49 perfetto::protos::pbzero::ProcessSingleton::RemoteHungProcessTerminateReason
50 ToProtoEnum(ProcessSingleton::RemoteHungProcessTerminateReason reason) {
53 CASE(USER_ACCEPTED_TERMINATION);
54 CASE(NO_VISIBLE_WINDOW_FOUND);
55 #elif BUILDFLAG(IS_POSIX)
56 CASE(NOTIFY_ATTEMPTS_EXCEEDED);
57 CASE(SOCKET_WRITE_FAILED);
58 CASE(SOCKET_READ_FAILED);
60 case ProcessSingleton::REMOTE_HUNG_PROCESS_TERMINATE_REASON_COUNT:
62 return perfetto::protos::pbzero::ProcessSingleton::
63 TERMINATE_REASON_UNSPECIFIED;
69 void SendRemoteProcessInteractionResultHistogram(
70 ProcessSingleton::RemoteProcessInteractionResult result) {
72 "startup", "ProcessSingleton:SendRemoteProcessInteractionResultHistogram",
73 [&](perfetto::EventContext ctx) {
74 auto* event = ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
75 auto* process_singleton = event->set_process_singleton();
76 process_singleton->set_remote_process_interaction_result(
80 UMA_HISTOGRAM_ENUMERATION(
81 "Chrome.ProcessSingleton.RemoteProcessInteractionResult", result,
82 ProcessSingleton::REMOTE_PROCESS_INTERACTION_RESULT_COUNT);
85 void SendRemoteHungProcessTerminateReasonHistogram(
86 ProcessSingleton::RemoteHungProcessTerminateReason reason) {
89 "ProcessSingleton:SendRemoteHungProcessTerminateReasonHistogram",
90 [&](perfetto::EventContext ctx) {
91 auto* event = ctx.event<perfetto::protos::pbzero::ChromeTrackEvent>();
92 auto* process_singleton = event->set_process_singleton();
93 process_singleton->set_remote_process_terminate_reason(
97 UMA_HISTOGRAM_ENUMERATION(
98 "Chrome.ProcessSingleton.RemoteHungProcessTerminateReason", reason,
99 ProcessSingleton::REMOTE_HUNG_PROCESS_TERMINATE_REASON_COUNT);
102 } // namespace internal