diff options
author | Yu-Hsuan Hsu <yuhsuan@chromium.org> | 2020-05-20 17:43:02 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-06-03 16:35:34 +0000 |
commit | d4109e5c481ce9f106cc1e6d3739c0d9da8812da (patch) | |
tree | 45c0afffb9010ef74d4b3f3081707e22c72d7aec | |
parent | ac71b07ecec4c9e31d747f0a9b33252cb402ad6e (diff) | |
download | adhd-d4109e5c481ce9f106cc1e6d3739c0d9da8812da.tar.gz |
CRAS: Log the length of busyloop
Log the length of busyloop in order to check the busyloop distribution.
BUG=b:157116480
TEST=Trigger busyloop manually and check the chrome://histograms
Change-Id: I7d69e940bc3b5e331c1fdf59df90020f3a4f4ecc
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/third_party/adhd/+/2209009
Reviewed-by: Cheng-Yi Chiang <cychiang@chromium.org>
Tested-by: Yu-Hsuan Hsu <yuhsuan@chromium.org>
Commit-Queue: Yu-Hsuan Hsu <yuhsuan@chromium.org>
-rw-r--r-- | cras/src/server/audio_thread.c | 18 | ||||
-rw-r--r-- | cras/src/server/cras_server_metrics.c | 26 | ||||
-rw-r--r-- | cras/src/server/cras_server_metrics.h | 3 | ||||
-rw-r--r-- | cras/src/tests/metrics_stub.cc | 4 | ||||
-rw-r--r-- | cras/src/tests/server_metrics_unittest.cc | 14 |
5 files changed, 65 insertions, 0 deletions
diff --git a/cras/src/server/audio_thread.c b/cras/src/server/audio_thread.c index 5482514b..73e61199 100644 --- a/cras/src/server/audio_thread.c +++ b/cras/src/server/audio_thread.c @@ -37,6 +37,13 @@ */ #define MAX_CONTINUOUS_ZERO_SLEEP_COUNT 2 +/* + * If the number of continuous zero sleep is equal to this limit, the value + * will be recorded immediately. It can ensure all busyloop will be recorded + * even if the busyloop does not stop. + */ +#define MAX_CONTINUOUS_ZERO_SLEEP_METRIC_LIMIT 1000 + /* Messages that can be sent from the main context to the audio thread. */ enum AUDIO_THREAD_COMMAND { AUDIO_THREAD_ADD_OPEN_DEV, @@ -783,7 +790,18 @@ static void check_busyloop(struct timespec *wait_ts) busyloop_count++; cras_audio_thread_event_busyloop(); } + if (continuous_zero_sleep_count == + MAX_CONTINUOUS_ZERO_SLEEP_METRIC_LIMIT) + cras_server_metrics_busyloop_length( + continuous_zero_sleep_count); + } else { + if (continuous_zero_sleep_count >= + MAX_CONTINUOUS_ZERO_SLEEP_COUNT && + continuous_zero_sleep_count < + MAX_CONTINUOUS_ZERO_SLEEP_METRIC_LIMIT) + cras_server_metrics_busyloop_length( + continuous_zero_sleep_count); continuous_zero_sleep_count = 0; } } diff --git a/cras/src/server/cras_server_metrics.c b/cras/src/server/cras_server_metrics.c index 69f1014e..3480d945 100644 --- a/cras/src/server/cras_server_metrics.c +++ b/cras/src/server/cras_server_metrics.c @@ -22,6 +22,7 @@ #define METRICS_NAME_BUFFER_SIZE 100 const char kBusyloop[] = "Cras.Busyloop"; +const char kBusyloopLength[] = "Cras.BusyloopLength"; const char kDeviceTypeInput[] = "Cras.DeviceTypeInput"; const char kDeviceTypeOutput[] = "Cras.DeviceTypeOutput"; const char kHighestDeviceDelayInput[] = "Cras.HighestDeviceDelayInput"; @@ -90,6 +91,7 @@ enum CRAS_SERVER_METRICS_TYPE { BT_WIDEBAND_SUPPORTED, BT_WIDEBAND_SELECTED_CODEC, BUSYLOOP, + BUSYLOOP_LENGTH, DEVICE_RUNTIME, HIGHEST_DEVICE_DELAY_INPUT, HIGHEST_DEVICE_DELAY_OUTPUT, @@ -885,6 +887,26 @@ int cras_server_metrics_busyloop(struct timespec *ts, unsigned count) return 0; } +int cras_server_metrics_busyloop_length(unsigned length) +{ + struct cras_server_metrics_message msg; + union cras_server_metrics_data data; + int err; + + data.value = length; + + init_server_metrics_msg(&msg, BUSYLOOP_LENGTH, data); + + err = cras_server_metrics_message_send( + (struct cras_main_message *)&msg); + if (err < 0) { + syslog(LOG_ERR, + "Failed to send metrics message: BUSYLOOP_LENGTH"); + return err; + } + return 0; +} + static void metrics_device_runtime(struct cras_server_metrics_device_data data) { char metrics_name[METRICS_NAME_BUFFER_SIZE]; @@ -1111,6 +1133,10 @@ static void handle_metrics_message(struct cras_main_message *msg, void *arg) case BUSYLOOP: metrics_busyloop(metrics_msg->data.timespec_data); break; + case BUSYLOOP_LENGTH: + cras_metrics_log_histogram( + kBusyloopLength, metrics_msg->data.value, 0, 1000, 50); + break; default: syslog(LOG_ERR, "Unknown metrics type %u", metrics_msg->metrics_type); diff --git a/cras/src/server/cras_server_metrics.h b/cras/src/server/cras_server_metrics.h index 1ca51c09..26adbb2f 100644 --- a/cras/src/server/cras_server_metrics.h +++ b/cras/src/server/cras_server_metrics.h @@ -76,6 +76,9 @@ int cras_server_metrics_stream_destroy(const struct cras_rstream *stream); /* Logs the number of busyloops for different time periods. */ int cras_server_metrics_busyloop(struct timespec *ts, unsigned count); +/* Logs the length of busyloops. */ +int cras_server_metrics_busyloop_length(unsigned length); + /* Initialize metrics logging stuff. */ int cras_server_metrics_init(); diff --git a/cras/src/tests/metrics_stub.cc b/cras/src/tests/metrics_stub.cc index 73998645..9a084c64 100644 --- a/cras/src/tests/metrics_stub.cc +++ b/cras/src/tests/metrics_stub.cc @@ -54,4 +54,8 @@ int cras_server_metrics_busyloop(struct timespec* ts, unsigned count) { return 0; } +int cras_server_metrics_busyloop_length(unsigned count) { + return 0; +} + } // extern "C" diff --git a/cras/src/tests/server_metrics_unittest.cc b/cras/src/tests/server_metrics_unittest.cc index db6c61f1..fe80e26f 100644 --- a/cras/src/tests/server_metrics_unittest.cc +++ b/cras/src/tests/server_metrics_unittest.cc @@ -337,6 +337,20 @@ TEST(ServerMetricsTestSuite, SetMetricsBusyloop) { EXPECT_EQ(sent_msgs[0].data.timespec_data.count, 3); } +TEST(ServerMetricsTestSuite, SetMetricsBusyloopLength) { + ResetStubData(); + unsigned length = 5; + + cras_server_metrics_busyloop_length(length); + + EXPECT_EQ(sent_msgs.size(), 1); + EXPECT_EQ(sent_msgs[0].header.type, CRAS_MAIN_METRICS); + EXPECT_EQ(sent_msgs[0].header.length, + sizeof(struct cras_server_metrics_message)); + EXPECT_EQ(sent_msgs[0].metrics_type, BUSYLOOP_LENGTH); + EXPECT_EQ(sent_msgs[0].data.value, 5); +} + extern "C" { int cras_main_message_add_handler(enum CRAS_MAIN_MESSAGE_TYPE type, |