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 /cras/src/server | |
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>
Diffstat (limited to 'cras/src/server')
-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 |
3 files changed, 47 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(); |