diff options
author | Yu-Hsuan Hsu <yuhsuan@chromium.org> | 2019-05-09 15:35:16 +0800 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2019-05-23 02:14:15 -0700 |
commit | f506386d91b607b90cf962c1c4b05e610438d6a6 (patch) | |
tree | 805a2be3f12174b6d1df72d6d5aed1a8e29f9ef4 /cras/src/server/cras_server_metrics.c | |
parent | 4e348890e89b136a8a189d0d9b77db23e036ad1b (diff) | |
download | adhd-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.c | 48 |
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"); |