* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA.
*/
-#define _GNU_SOURCE
#define _LGPL_SOURCE
#include <assert.h>
#include <stdlib.h>
#include <sys/resource.h>
#include <sys/time.h>
+#include <stdbool.h>
#include <common/defaults.h>
#include <common/error.h>
}
if (!poll_max_size) {
- ERR("poll_max_size not initialized yet");
- goto error;
+ if (lttng_poll_set_max_size()) {
+ goto error;
+ }
}
/* Don't bust the limit here */
return -1;
}
+/*
+ * Modify an fd's events..
+ */
+int compat_poll_mod(struct lttng_poll_event *events, int fd,
+ uint32_t req_events)
+{
+ int i;
+ bool fd_found = false;
+ struct compat_poll_event_array *current;
+
+ if (events == NULL || events->current.events == NULL || fd < 0) {
+ ERR("Bad compat poll mod arguments");
+ goto error;
+ }
+
+ current = &events->current;
+
+ for (i = 0; i < current->nb_fd; i++) {
+ if (current->events[i].fd == fd) {
+ fd_found = true;
+ current->events[i].events = req_events;
+ events->need_update = 1;
+ break;
+ }
+ }
+
+ if (!fd_found) {
+ goto error;
+ }
+
+ return 0;
+
+error:
+ return -1;
+}
+
/*
* Remove a fd from the pollfd structure.
*/
}
}
- ret = poll(events->wait.events, events->wait.nb_fd, timeout);
+ do {
+ ret = poll(events->wait.events, events->wait.nb_fd, timeout);
+ } while (ret == -1 && errno == EINTR);
if (ret < 0) {
/* At this point, every error is fatal */
PERROR("poll wait");