OSDN Git Service

HID: Check for EINTR in uhid_event() and fix return value evaluation
authorAndre Eisenbach <eisenbach@google.com>
Mon, 30 May 2016 19:00:46 +0000 (12:00 -0700)
committerPavlin Radoslavov <pavlin@google.com>
Mon, 15 Aug 2016 21:16:23 +0000 (21:16 +0000)
uhid_event() returns 0 in the normal case. Commit 3a2c2d61
results in the polling thread to be exited.

Bug: 28942565
Change-Id: Id0aff2958bc7c2704ba340aa0ff7848afb8dcf80
(cherry picked from commit 32d66694e9f782a0e9dfa423015284a573f8975c)

btif/co/bta_hh_co.cc

index 4603517..ce0dc57 100644 (file)
  *
  ******************************************************************************/
 
-
+#include <assert.h>
 #include <ctype.h>
+#include <errno.h>
 #include <fcntl.h>
-#include <sys/poll.h>
+#include <linux/uhid.h>
 #include <pthread.h>
 #include <stdio.h>
 #include <string.h>
 #include <stdint.h>
-#include <errno.h>
-#include <unistd.h>
-#include <linux/uhid.h>
+#include <sys/poll.h>
 #include <unistd.h>
+
+#include "btcore/include/bdaddr.h"
 #include "osi/include/osi.h"
-#include "btif_hh.h"
 #include "bta_api.h"
 #include "bta_hh_api.h"
-#include "btif_util.h"
 #include "bta_hh_co.h"
-#include "btcore/include/bdaddr.h"
+#include "btif_hh.h"
+#include "btif_util.h"
 
 const char *dev_path = "/dev/uhid";
 
@@ -60,8 +60,8 @@ void uhid_set_non_blocking(int fd)
 static int uhid_write(int fd, const struct uhid_event *ev)
 {
     ssize_t ret;
-
     OSI_NO_INTR(ret = write(fd, ev, sizeof(*ev)));
+
     if (ret < 0){
         int rtn = -errno;
         APPL_TRACE_ERROR("%s: Cannot write to uhid:%s",
@@ -77,17 +77,16 @@ static int uhid_write(int fd, const struct uhid_event *ev)
 }
 
 /* Internal function to parse the events received from UHID driver*/
-static int uhid_event(btif_hh_device_t *p_dev)
+static int uhid_read_event(btif_hh_device_t *p_dev)
 {
+    assert(p_dev);
+
     struct uhid_event ev;
-    ssize_t ret;
     memset(&ev, 0, sizeof(ev));
-    if(!p_dev)
-    {
-        APPL_TRACE_ERROR("%s: Device not found",__func__)
-        return -1;
-    }
-    ret = read(p_dev->fd, &ev, sizeof(ev));
+
+    ssize_t ret;
+    OSI_NO_INTR(ret = read(p_dev->fd, &ev, sizeof(ev)));
+
     if (ret == 0) {
         APPL_TRACE_ERROR("%s: Read HUP on uhid-cdev %s", __func__,
                                                  strerror(errno));
@@ -216,8 +215,8 @@ static void *btif_hh_poll_event_thread(void *arg)
         }
         if (pfds[0].revents & POLLIN) {
             APPL_TRACE_DEBUG("%s: POLLIN", __func__);
-            ret = uhid_event(p_dev);
-            if (ret != -EINTR && ret != 0)
+            ret = uhid_read_event(p_dev);
+            if (ret != 0)
                 break;
         }
     }
@@ -440,7 +439,7 @@ void bta_hh_co_data(uint8_t dev_handle, uint8_t *p_rpt, uint16_t len, tBTA_HH_PR
     if ((p_dev->fd >= 0) && p_dev->ready_for_data) {
         bta_hh_co_write(p_dev->fd, p_rpt, len);
     }else {
-        APPL_TRACE_WARNING("%s: Error: fd = %d, ready %d, len = %d", __func__, p_dev->fd, 
+        APPL_TRACE_WARNING("%s: Error: fd = %d, ready %d, len = %d", __func__, p_dev->fd,
                             p_dev->ready_for_data, len);
     }
 }