summaryrefslogtreecommitdiffstats
path: root/sensors/piranha_sensors.c
diff options
context:
space:
mode:
Diffstat (limited to 'sensors/piranha_sensors.c')
-rw-r--r--sensors/piranha_sensors.c40
1 files changed, 23 insertions, 17 deletions
diff --git a/sensors/piranha_sensors.c b/sensors/piranha_sensors.c
index c1fd534..c08515b 100644
--- a/sensors/piranha_sensors.c
+++ b/sensors/piranha_sensors.c
@@ -137,7 +137,7 @@ int piranha_sensors_poll(struct sensors_poll_device_t *dev,
struct piranha_sensors_device *device;
int i, j;
int c, n;
- int rc;
+ int poll_rc, rc;
// LOGD("%s(%p, %p, %d)", __func__, dev, data, count);
@@ -152,27 +152,33 @@ int piranha_sensors_poll(struct sensors_poll_device_t *dev,
n = 0;
- for (i=0 ; i < device->poll_fds_count ; i++) {
- if (!(device->poll_fds[i].revents & POLLIN))
- continue;
+ do {
+ poll_rc = poll(device->poll_fds, device->poll_fds_count, PIRANHA_POLL_DELAY);
+ if (poll_rc < 0)
+ return -1;
- for (j=0 ; j < device->handlers_count ; j++) {
- if (device->handlers[j] == NULL || device->handlers[j]->poll_fd != device->poll_fds[i].fd || device->handlers[j]->get_data == NULL)
+ for (i=0 ; i < device->poll_fds_count ; i++) {
+ if (!(device->poll_fds[i].revents & POLLIN))
continue;
- rc = device->handlers[j]->get_data(device->handlers[j], &data[n]);
- if (rc < 0) {
- device->poll_fds[i].revents = 0;
- } else {
- n++;
- count--;
+ for (j=0 ; j < device->handlers_count ; j++) {
+ if (device->handlers[j] == NULL || device->handlers[j]->poll_fd != device->poll_fds[i].fd || device->handlers[j]->get_data == NULL)
+ continue;
+
+ rc = device->handlers[j]->get_data(device->handlers[j], &data[n]);
+ if (rc < 0) {
+ device->poll_fds[i].revents = 0;
+ poll_rc = -1;
+ } else {
+ n++;
+ count--;
+ }
}
- }
- }
- rc = poll(device->poll_fds, device->poll_fds_count, n > 0 ? 0 : -1);
- if (rc < 0)
- return -1;
+ if (count <= 0)
+ break;
+ }
+ } while ((poll_rc > 0 || n < 1) && count > 0);
return n;
}