Merge "part of fix for [3004226] Cannot end the call - Proximity sensor doesn't work" into gingerbread
This commit is contained in:
committed by
Android (Google) Code Review
commit
08710dcd58
@@ -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++) {
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user