OSDN Git Service

part of fix for [3004226] Cannot end the call - Proximity sensor doesn't work
authorMathias Agopian <mathias@google.com>
Fri, 17 Sep 2010 00:04:16 +0000 (17:04 -0700)
committerMathias Agopian <mathias@google.com>
Fri, 17 Sep 2010 00:33:48 +0000 (17:33 -0700)
- In SensorEventQueue, only bail on errors from Looper::loopOnce
- Improve sensor error logging

Change-Id: Ib3cf8d5d9fdac8513a3d753155827e0feeda1662

libs/gui/SensorEventQueue.cpp

index c3a9f22..b0d0f12 100644 (file)
@@ -70,9 +70,13 @@ ssize_t SensorEventQueue::write(ASensorEvent const* events, size_t numEvents)
 ssize_t SensorEventQueue::read(ASensorEvent* events, size_t numEvents)
 {
     ssize_t size = mSensorChannel->read(events, numEvents*sizeof(events[0]));
+    LOGE_IF(size<0 && size!=-EAGAIN,
+            "SensorChannel::read error (%s)", strerror(-size));
     if (size >= 0) {
         if (size % sizeof(events[0])) {
             // partial read!!! should never happen.
+            LOGE("SensorEventQueue partial read (event-size=%u, read=%d)",
+                    sizeof(events[0]), int(size));
             return -EINVAL;
         }
         // returns number of events read
@@ -95,8 +99,18 @@ status_t SensorEventQueue::waitForEvent() const
 {
     const int fd = getFd();
     sp<Looper> looper(getLooper());
-    int32_t result = looper->pollOnce(-1);
-    return (result == fd) ? status_t(NO_ERROR) : status_t(-1);
+
+    int32_t result;
+    do {
+        result = looper->pollOnce(-1);
+        if (result == ALOOPER_EVENT_ERROR) {
+            LOGE("SensorChannel::waitForEvent error (errno=%d)", errno);
+            result = -EPIPE; // unknown error, so we make up one
+            break;
+        }
+    } while (result != fd);
+
+    return result;
 }
 
 status_t SensorEventQueue::wake() const