summaryrefslogtreecommitdiff
path: root/cras/src/server/cras_server_metrics.c
diff options
context:
space:
mode:
authorYu-Hsuan Hsu <yuhsuan@chromium.org>2019-05-09 15:35:16 +0800
committerchrome-bot <chrome-bot@chromium.org>2019-05-23 02:14:15 -0700
commitf506386d91b607b90cf962c1c4b05e610438d6a6 (patch)
tree805a2be3f12174b6d1df72d6d5aed1a8e29f9ef4 /cras/src/server/cras_server_metrics.c
parent4e348890e89b136a8a189d0d9b77db23e036ad1b (diff)
downloadadhd-f506386d91b607b90cf962c1c4b05e610438d6a6.tar.gz
CRAS: cras_server_metrics - Check thread before sending messages
Before sending CRAS main messages, we should check which thread we belong to. If we are in the main thread, we can handle it directly. It is a precursor to enable logging UMA to the main thread. If the size of message is greater than PIPE_BUF, which is 4096 bytes in linux, it will be split into multiple packets. It may cause race condition if we send messages from main thread and audio thread an the same time. The CL can also avoid this situation. BUG=chromium:960297 TEST=UMA logs can be recorded well on peppy. Change-Id: Iad650e73da10489cafa0c64a59bbe5ae2660a7a6 Reviewed-on: https://chromium-review.googlesource.com/1598997 Commit-Ready: Yu-Hsuan Hsu <yuhsuan@chromium.org> Tested-by: Yu-Hsuan Hsu <yuhsuan@chromium.org> Legacy-Commit-Queue: Commit Bot <commit-bot@chromium.org> Reviewed-by: Cheng-Yi Chiang <cychiang@chromium.org>
Diffstat (limited to 'cras/src/server/cras_server_metrics.c')
-rw-r--r--cras/src/server/cras_server_metrics.c48
1 files changed, 39 insertions, 9 deletions
diff --git a/cras/src/server/cras_server_metrics.c b/cras/src/server/cras_server_metrics.c
index f6e22ee3..cf3e9978 100644
--- a/cras/src/server/cras_server_metrics.c
+++ b/cras/src/server/cras_server_metrics.c
@@ -12,6 +12,7 @@
#include "cras_metrics.h"
#include "cras_main_message.h"
#include "cras_rstream.h"
+#include "cras_system_state.h"
const char kHighestDeviceDelayInput[] = "Cras.HighestDeviceDelayInput";
const char kHighestDeviceDelayOutput[] = "Cras.HighestDeviceDelayOutput";
@@ -78,6 +79,13 @@ union cras_server_metrics_data {
struct cras_server_metrics_stream_config stream_config;
};
+/*
+ * Make sure the size of message in the acceptable range. Otherwise, it may
+ * be split into mutiple packets while sending.
+ */
+static_assert(sizeof(union cras_server_metrics_data) <= 256,
+ "The size is too large.");
+
struct cras_server_metrics_message {
struct cras_main_message header;
enum CRAS_SERVER_METRICS_TYPE metrics_type;
@@ -96,6 +104,19 @@ static void init_server_metrics_msg(
msg->data = data;
}
+static void handle_metrics_message(struct cras_main_message *msg, void *arg);
+
+/* The wrapper function of cras_main_message_send. */
+static int cras_server_metrics_message_send(struct cras_main_message *msg)
+{
+ /* If current function is in the main thread, call handler directly. */
+ if (cras_system_state_in_main_thread()) {
+ handle_metrics_message(msg, NULL);
+ return 0;
+ }
+ return cras_main_message_send(msg);
+}
+
int cras_server_metrics_highest_device_delay(unsigned int hw_level,
unsigned int largest_cb_level, enum CRAS_STREAM_DIRECTION direction)
{
@@ -130,7 +151,8 @@ int cras_server_metrics_highest_device_delay(unsigned int hw_level,
return 0;
}
- err = cras_main_message_send((struct cras_main_message *)&msg);
+ err = cras_server_metrics_message_send(
+ (struct cras_main_message *)&msg);
if (err < 0) {
syslog(LOG_ERR,
"Failed to send metrics message: HIGHEST_DEVICE_DELAY");
@@ -160,7 +182,8 @@ int cras_server_metrics_highest_hw_level(unsigned hw_level,
return 0;
}
- err = cras_main_message_send((struct cras_main_message *)&msg);
+ err = cras_server_metrics_message_send(
+ (struct cras_main_message *)&msg);
if (err < 0) {
syslog(LOG_ERR,
"Failed to send metrics message: HIGHEST_HW_LEVEL");
@@ -178,7 +201,8 @@ int cras_server_metrics_longest_fetch_delay(unsigned delay_msec)
data.value = delay_msec;
init_server_metrics_msg(&msg, LONGEST_FETCH_DELAY, data);
- err = cras_main_message_send((struct cras_main_message *)&msg);
+ err = cras_server_metrics_message_send(
+ (struct cras_main_message *)&msg);
if (err < 0) {
syslog(LOG_ERR,
"Failed to send metrics message: LONGEST_FETCH_DELAY");
@@ -196,7 +220,8 @@ int cras_server_metrics_num_underruns(unsigned num_underruns)
data.value = num_underruns;
init_server_metrics_msg(&msg, NUM_UNDERRUNS, data);
- err = cras_main_message_send((struct cras_main_message *)&msg);
+ err = cras_server_metrics_message_send(
+ (struct cras_main_message *)&msg);
if (err < 0) {
syslog(LOG_ERR,
"Failed to send metrics message: NUM_UNDERRUNS");
@@ -231,7 +256,8 @@ int cras_server_metrics_missed_cb_frequency(const struct cras_rstream *stream)
else
init_server_metrics_msg(&msg, MISSED_CB_FREQUENCY_OUTPUT, data);
- err = cras_main_message_send((struct cras_main_message *)&msg);
+ err = cras_server_metrics_message_send(
+ (struct cras_main_message *)&msg);
if (err < 0) {
syslog(LOG_ERR,
"Failed to send metrics message: MISSED_CB_FREQUENCY");
@@ -262,7 +288,8 @@ int cras_server_metrics_missed_cb_frequency(const struct cras_rstream *stream)
data);
}
- err = cras_main_message_send((struct cras_main_message *)&msg);
+ err = cras_server_metrics_message_send(
+ (struct cras_main_message *)&msg);
if (err < 0) {
syslog(LOG_ERR,
"Failed to send metrics message: MISSED_CB_FREQUENCY");
@@ -294,7 +321,8 @@ cras_server_metrics_missed_cb_first_time(const struct cras_rstream *stream)
init_server_metrics_msg(&msg, MISSED_CB_FIRST_TIME_OUTPUT,
data);
}
- err = cras_main_message_send((struct cras_main_message *)&msg);
+ err = cras_server_metrics_message_send(
+ (struct cras_main_message *)&msg);
if (err < 0) {
syslog(LOG_ERR, "Failed to send metrics message: "
"MISSED_CB_FIRST_TIME");
@@ -324,7 +352,8 @@ cras_server_metrics_missed_cb_second_time(const struct cras_rstream *stream)
init_server_metrics_msg(&msg, MISSED_CB_SECOND_TIME_OUTPUT,
data);
}
- err = cras_main_message_send((struct cras_main_message *)&msg);
+ err = cras_server_metrics_message_send(
+ (struct cras_main_message *)&msg);
if (err < 0) {
syslog(LOG_ERR, "Failed to send metrics message: "
"MISSED_CB_SECOND_TIME");
@@ -367,7 +396,8 @@ int cras_server_metrics_stream_config(struct cras_rstream_config *config)
data.stream_config.rate = (unsigned)config->format->frame_rate;
init_server_metrics_msg(&msg, STREAM_CONFIG, data);
- err = cras_main_message_send((struct cras_main_message *)&msg);
+ err = cras_server_metrics_message_send(
+ (struct cras_main_message *)&msg);
if (err < 0) {
syslog(LOG_ERR,
"Failed to send metrics message: STREAM_CONFIG");