summaryrefslogtreecommitdiff
path: root/cras/src/server
diff options
context:
space:
mode:
authorYu-Hsuan Hsu <yuhsuan@chromium.org>2020-05-20 17:43:02 +0800
committerCommit Bot <commit-bot@chromium.org>2020-06-03 16:35:34 +0000
commitd4109e5c481ce9f106cc1e6d3739c0d9da8812da (patch)
tree45c0afffb9010ef74d4b3f3081707e22c72d7aec /cras/src/server
parentac71b07ecec4c9e31d747f0a9b33252cb402ad6e (diff)
downloadadhd-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.c18
-rw-r--r--cras/src/server/cras_server_metrics.c26
-rw-r--r--cras/src/server/cras_server_metrics.h3
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();