diff --git a/core/java/android/hardware/SensorManager.java b/core/java/android/hardware/SensorManager.java index 76ce2f8d651de..a2710757fb03a 100644 --- a/core/java/android/hardware/SensorManager.java +++ b/core/java/android/hardware/SensorManager.java @@ -447,12 +447,12 @@ public class SensorManager int accuracy = status[0]; synchronized (sListeners) { if (sensor == -1 || sListeners.isEmpty()) { - if (sensor == -1) { - // we lost the connection to the event stream. this happens - // when the last listener is removed. - Log.d(TAG, "_sensors_data_poll() failed, we bail out."); + // we lost the connection to the event stream. this happens + // when the last listener is removed or if there is an error + if (sensor == -1 && !sListeners.isEmpty()) { + // log a warning in case of abnormal termination + Log.e(TAG, "_sensors_data_poll() failed, we bail out: sensors=" + sensor); } - // we have no more listeners or polling failed, terminate the thread sensors_destroy_queue(sQueue); sQueue = 0; @@ -1101,6 +1101,7 @@ public class SensorManager if (listener == null || sensor == null) { return; } + synchronized (sListeners) { final int size = sListeners.size(); for (int i=0 ; iread(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(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