diff options
Diffstat (limited to 'libsensors_iio/src/SensorBase.cpp')
-rw-r--r-- | libsensors_iio/src/SensorBase.cpp | 61 |
1 files changed, 52 insertions, 9 deletions
diff --git a/libsensors_iio/src/SensorBase.cpp b/libsensors_iio/src/SensorBase.cpp index 992d3d4..bfee207 100644 --- a/libsensors_iio/src/SensorBase.cpp +++ b/libsensors_iio/src/SensorBase.cpp @@ -369,9 +369,43 @@ bool SensorBase::FillSensor_tData(struct sensor_t *data) return true; } -int SensorBase::FlushData(bool) +int SensorBase::WritePipeWithPoll(sensors_event_t *event_data, int size, int timeout) { int err; + struct pollfd poll_fd; + + poll_fd.fd = android_pipe_fd; + poll_fd.events = POLLOUT; + + err = poll(&poll_fd, (unsigned long)1, timeout); + if (err < 0) { + ALOGE("%s: error happened when polling pipe, errno: %d.", android_name, errno); + return err; + } + + if (err == 0) { + ALOGE("%s: polling pipe timeout, timeout = %d.", android_name, timeout); + return err; + } + + if (poll_fd.revents&POLLOUT) { + err = write(android_pipe_fd, event_data, size); + if (err <= 0) { + ALOGE("%s: Failed to write to pipe, timeout: %d, errno: %d.", + android_name, timeout, errno); + return err; + } + } else { + ALOGE("%s: polling was breaked by unexpected event: %d", android_name, poll_fd.revents); + return -EAGAIN; + } + + return err; +} + +int SensorBase::FlushData(bool) +{ + int err = 0, retry = 3; sensors_event_t flush_event_data; flush_event_data.sensor = 0; @@ -381,14 +415,22 @@ int SensorBase::FlushData(bool) flush_event_data.type = SENSOR_TYPE_META_DATA; flush_event_data.version = META_DATA_VERSION; - err = write(android_pipe_fd, &flush_event_data, sizeof(sensor_event)); - if (err < 0) { - ALOGE("%s: Failed to write flush event data to pipe.", android_name); - return err; + while (retry) { + err = WritePipeWithPoll(&flush_event_data, sizeof(sensor_event), + POLL_TIMEOUT_FLUSH_EVENT); + if (err > 0) + break; + + retry--; + ALOGI("%s: Retry writing flush event data to pipe, retry_cnt: %d.", android_name, 3-retry); } - ALOGD("SensorBase::FlushData completed."); - return 0; + if (retry == 0) + ALOGE("%s: Failed to write flush event data to pipe, err=%d.", android_name, err); + else + ALOGD("SensorBase::FlushData completed."); + + return err; } void SensorBase::WriteDataToPipe() @@ -399,8 +441,9 @@ void SensorBase::WriteDataToPipe() return; if (sensor_event.timestamp > last_data_timestamp) { - err = write(android_pipe_fd, &sensor_event, sizeof(sensor_event)); - if (err < 0) { + err = WritePipeWithPoll(&sensor_event, sizeof(sensor_event), + POLL_TIMEOUT_DATA_EVENT); + if (err <= 0) { ALOGE("%s: Failed to write sensor data to pipe.", android_name); return; } |