Fix: sessiond: off-by-one poll check when draining an event notifier
authorJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 12 Mar 2021 19:54:52 +0000 (14:54 -0500)
committerJérémie Galarneau <jeremie.galarneau@efficios.com>
Fri, 12 Mar 2021 20:02:00 +0000 (15:02 -0500)
When an event source is removed (on the death of an application), the
notification thread "drains" any remaining notifications from the
event notifier pipe.

In doing so, it creates a new poll set containing the event source to
check if messages are left in the event notification pipe.

The invocation of `LTTNG_POLL_GETEV(&events, 1)` means to check the
events pending for the first (and only) fd in the poll set. This check
is off by one since `0` should be used.

For some reason, this worked everywhere except when using a 32-bit
userland on a 64-bit kernel (on x86_64).

Signed-off-by: Jérémie Galarneau <jeremie.galarneau@efficios.com>
Change-Id: I6f274fdd7c80d5676fd48ae20a14adb3cc010142

src/bin/lttng-sessiond/notification-thread-events.c

index 6bd799279b3ff6cead92c77bb2553c6117ed5afc..747902612d93059705cd9d987cde39e1cc757a31 100644 (file)
@@ -2017,7 +2017,7 @@ int drain_event_notifier_notification_pipe(
                 * the pipe is closed but empty.
                 */
                ret = lttng_poll_wait_interruptible(&events, 0);
-               if (ret == 0 || (LTTNG_POLL_GETEV(&events, 1) & LPOLLIN) == 0) {
+               if (ret == 0 || (LTTNG_POLL_GETEV(&events, 0) & LPOLLIN) == 0) {
                        /* No more notification to be read on this pipe. */
                        ret = 0;
                        goto end;
This page took 0.027125 seconds and 4 git commands to generate.