[lttng-dev] [PATCH lttng-tools 6/8] Change lttng_poll_wait behaviour of compat-poll to match compat-epoll
Yannick Lamarre
ylamarre at efficios.com
Tue Mar 19 17:17:33 EDT 2019
This removes the need to verify for eventless file descriptors and
mitigates risks of bug due to behaviour mismatch.
Signed-off-by: Yannick Lamarre <ylamarre at efficios.com>
---
src/common/compat/compat-poll.c | 26 +++++++++++++++++++++++---
1 file changed, 23 insertions(+), 3 deletions(-)
diff --git a/src/common/compat/compat-poll.c b/src/common/compat/compat-poll.c
index b7c17df7..27e2002b 100644
--- a/src/common/compat/compat-poll.c
+++ b/src/common/compat/compat-poll.c
@@ -292,6 +292,8 @@ error:
int compat_poll_wait(struct lttng_poll_event *events, int timeout)
{
int ret;
+ int count = 0, idx;
+ struct pollfd swapfd;
if (events == NULL || events->current.events == NULL) {
ERR("poll wait arguments error");
@@ -324,10 +326,28 @@ int compat_poll_wait(struct lttng_poll_event *events, int timeout)
}
/*
- * poll() should always iterate on all FDs since we handle the pollset in
- * user space and after poll returns, we have to try every fd for a match.
+ * Swap all nonzero revents pollfd structs to the beginning of the array to
+ * emulate cpmpat-epoll behaviour.
*/
- return events->wait.nb_fd;
+ if ( ret != events->wait.nb_fd && ret != 0) {
+ while (count < ret && events->wait.events[count].revents != 0) {
+ count += 1;
+ }
+ idx = count + 1;
+ while (count < ret) {
+ if (events->wait.events[idx].revents != 0) {
+ swapfd = events->wait.events[idx];
+ events->wait.events[idx] = events->wait.events[count];
+ events->wait.events[count] = swapfd;
+ count += 1;
+ }
+ if (idx < (events->wait.nb_fd - 1)) {
+ idx += 1;
+ }
+ }
+ }
+
+ return ret;
error:
return -1;
--
2.11.0
More information about the lttng-dev
mailing list