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

Reply via email to