This is an automatic generated email to let you know that the following patch were queued at the http://git.linuxtv.org/cgit.cgi/v4l-utils.git tree:
Subject: cec-compliance: add timeout to util_receive Author: Hans Verkuil <hverkuil-ci...@xs4all.nl> Date: Mon Oct 14 14:33:37 2019 +0200 util_receive() can currently loop indefinitely if it never gets the expected reply. Add a timeout. Signed-off-by: Hans Verkuil <hverkuil-ci...@xs4all.nl> utils/cec-compliance/cec-compliance.cpp | 14 ++++++++------ utils/cec-compliance/cec-compliance.h | 5 +++-- utils/cec-compliance/cec-test-audio.cpp | 3 ++- 3 files changed, 13 insertions(+), 9 deletions(-) --- http://git.linuxtv.org/cgit.cgi/v4l-utils.git/commit/?id=f87baf65b16328e6bdf8ead57f54ace229caa3c9 diff --git a/utils/cec-compliance/cec-compliance.cpp b/utils/cec-compliance/cec-compliance.cpp index 0161bc9d9935..6f11e4d51441 100644 --- a/utils/cec-compliance/cec-compliance.cpp +++ b/utils/cec-compliance/cec-compliance.cpp @@ -891,10 +891,12 @@ retry: return true; } -bool util_receive(struct node *node, unsigned la, struct cec_msg *msg, - __u8 sent_msg, __u8 reply1, __u8 reply2) +int util_receive(struct node *node, unsigned la, unsigned timeout, + struct cec_msg *msg, __u8 sent_msg, __u8 reply1, __u8 reply2) { - while (1) { + unsigned ts_start = get_ts_ms(); + + while (get_ts_ms() - ts_start < timeout) { memset(msg, 0, sizeof(*msg)); msg->timeout = 1; if (doioctl(node, CEC_RECEIVE, msg)) @@ -908,14 +910,14 @@ bool util_receive(struct node *node, unsigned la, struct cec_msg *msg, cec_ops_feature_abort(msg, &abort_msg, &reason); if (abort_msg != sent_msg) continue; - return true; + return 0; } if (msg->msg[1] == reply1 || (reply2 && msg->msg[1] == reply2)) - return true; + return msg->msg[1]; } - return false; + return -1; } static int poll_remote_devs(struct node *node) diff --git a/utils/cec-compliance/cec-compliance.h b/utils/cec-compliance/cec-compliance.h index b983bdba210d..4b3c163c67fc 100644 --- a/utils/cec-compliance/cec-compliance.h +++ b/utils/cec-compliance/cec-compliance.h @@ -387,8 +387,9 @@ const char *host_func_state2s(__u8 hfs); const char *enc_func_state2s(__u8 efs); const char *cdc_errcode2s(__u8 cdc_errcode); int check_0(const void *p, int len); -bool util_receive(struct node *node, unsigned la, struct cec_msg *msg, - __u8 sent_msg, __u8 reply1, __u8 reply2 = 0); +int util_receive(struct node *node, unsigned la, unsigned timeout, + struct cec_msg *msg, __u8 sent_msg, + __u8 reply1, __u8 reply2 = 0); // CEC adapter tests int testCap(struct node *node); diff --git a/utils/cec-compliance/cec-test-audio.cpp b/utils/cec-compliance/cec-test-audio.cpp index 17d6be3e3972..42b51e0c3703 100644 --- a/utils/cec-compliance/cec-test-audio.cpp +++ b/utils/cec-compliance/cec-test-audio.cpp @@ -619,7 +619,8 @@ static int sac_util_send_user_control_press(struct node *node, unsigned me, unsi cec_msg_init(&msg, me, la); cec_msg_user_control_released(&msg); fail_on_test(!transmit_timeout(node, &msg)); - got_response = util_receive(node, la, &msg, CEC_MSG_USER_CONTROL_PRESSED, CEC_MSG_REPORT_AUDIO_STATUS); + got_response = util_receive(node, la, 1000, &msg, + CEC_MSG_USER_CONTROL_PRESSED, CEC_MSG_REPORT_AUDIO_STATUS) >= 0; mode = CEC_MODE_INITIATOR; doioctl(node, CEC_S_MODE, &mode); _______________________________________________ linuxtv-commits mailing list linuxtv-commits@linuxtv.org https://www.linuxtv.org/cgi-bin/mailman/listinfo/linuxtv-commits