Merge "part of fix for [3004226] Cannot end the call - Proximity sensor doesn't work" into gingerbread

This commit is contained in:
Mathias Agopian
2010-09-16 17:54:50 -07:00
committed by Android (Google) Code Review
2 changed files with 23 additions and 7 deletions

View File

@@ -447,12 +447,12 @@ public class SensorManager
int accuracy = status[0]; int accuracy = status[0];
synchronized (sListeners) { synchronized (sListeners) {
if (sensor == -1 || sListeners.isEmpty()) { if (sensor == -1 || sListeners.isEmpty()) {
if (sensor == -1) { // we lost the connection to the event stream. this happens
// we lost the connection to the event stream. this happens // when the last listener is removed or if there is an error
// when the last listener is removed. if (sensor == -1 && !sListeners.isEmpty()) {
Log.d(TAG, "_sensors_data_poll() failed, we bail out."); // 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 // we have no more listeners or polling failed, terminate the thread
sensors_destroy_queue(sQueue); sensors_destroy_queue(sQueue);
sQueue = 0; sQueue = 0;
@@ -1101,6 +1101,7 @@ public class SensorManager
if (listener == null || sensor == null) { if (listener == null || sensor == null) {
return; return;
} }
synchronized (sListeners) { synchronized (sListeners) {
final int size = sListeners.size(); final int size = sListeners.size();
for (int i=0 ; i<size ; i++) { for (int i=0 ; i<size ; i++) {
@@ -1122,6 +1123,7 @@ public class SensorManager
if (listener == null) { if (listener == null) {
return; return;
} }
synchronized (sListeners) { synchronized (sListeners) {
final int size = sListeners.size(); final int size = sListeners.size();
for (int i=0 ; i<size ; i++) { for (int i=0 ; i<size ; i++) {

View 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 SensorEventQueue::read(ASensorEvent* events, size_t numEvents)
{ {
ssize_t size = mSensorChannel->read(events, numEvents*sizeof(events[0])); 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 >= 0) {
if (size % sizeof(events[0])) { if (size % sizeof(events[0])) {
// partial read!!! should never happen. // partial read!!! should never happen.
LOGE("SensorEventQueue partial read (event-size=%u, read=%d)",
sizeof(events[0]), int(size));
return -EINVAL; return -EINVAL;
} }
// returns number of events read // returns number of events read
@@ -95,8 +99,18 @@ status_t SensorEventQueue::waitForEvent() const
{ {
const int fd = getFd(); const int fd = getFd();
sp<Looper> looper(getLooper()); 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 status_t SensorEventQueue::wake() const