Use std::vector in event-loop.cc

In my occasional and continuing campaign against realloc, this patch
changes event-loop.cc to use std::vector to keep track of pollfd
objects.  Regression tested on x86-64 Fedora 38.

Approved-By: Simon Marchi <simon.marchi@efficios.com>
Approved-By: John Baldwin <jhb@FreeBSD.org>
This commit is contained in:
Tom Tromey
2024-04-06 12:37:37 -06:00
parent b5247082c4
commit 1f984aabf1

View File

@@ -112,8 +112,8 @@ static struct
file_handler *next_file_handler; file_handler *next_file_handler;
#ifdef HAVE_POLL #ifdef HAVE_POLL
/* Ptr to array of pollfd structures. */ /* Descriptors to poll. */
struct pollfd *poll_fds; std::vector<struct pollfd> poll_fds;
/* Next file descriptor to handle, for the poll variant. To level /* Next file descriptor to handle, for the poll variant. To level
the fairness across event sources, we poll the file descriptors the fairness across event sources, we poll the file descriptors
@@ -336,17 +336,11 @@ create_file_handler (int fd, int mask, handler_func * proc,
if (use_poll) if (use_poll)
{ {
gdb_notifier.num_fds++; gdb_notifier.num_fds++;
if (gdb_notifier.poll_fds) struct pollfd new_fd;
gdb_notifier.poll_fds = new_fd.fd = fd;
(struct pollfd *) xrealloc (gdb_notifier.poll_fds, new_fd.events = mask;
(gdb_notifier.num_fds new_fd.revents = 0;
* sizeof (struct pollfd))); gdb_notifier.poll_fds.push_back (new_fd);
else
gdb_notifier.poll_fds =
XNEW (struct pollfd);
(gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->fd = fd;
(gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->events = mask;
(gdb_notifier.poll_fds + gdb_notifier.num_fds - 1)->revents = 0;
} }
else else
#endif /* HAVE_POLL */ #endif /* HAVE_POLL */
@@ -426,28 +420,13 @@ delete_file_handler (int fd)
#ifdef HAVE_POLL #ifdef HAVE_POLL
if (use_poll) if (use_poll)
{ {
int j; auto iter = std::remove_if (gdb_notifier.poll_fds.begin (),
struct pollfd *new_poll_fds; gdb_notifier.poll_fds.end (),
[=] (const pollfd &item)
/* Create a new poll_fds array by copying every fd's information
but the one we want to get rid of. */
new_poll_fds = (struct pollfd *)
xmalloc ((gdb_notifier.num_fds - 1) * sizeof (struct pollfd));
for (i = 0, j = 0; i < gdb_notifier.num_fds; i++)
{ {
if ((gdb_notifier.poll_fds + i)->fd != fd) return item.fd == fd;
{ });
(new_poll_fds + j)->fd = (gdb_notifier.poll_fds + i)->fd; gdb_notifier.poll_fds.erase (iter, gdb_notifier.poll_fds.end());
(new_poll_fds + j)->events = (gdb_notifier.poll_fds + i)->events;
(new_poll_fds + j)->revents
= (gdb_notifier.poll_fds + i)->revents;
j++;
}
}
xfree (gdb_notifier.poll_fds);
gdb_notifier.poll_fds = new_poll_fds;
gdb_notifier.num_fds--; gdb_notifier.num_fds--;
} }
else else
@@ -605,7 +584,7 @@ gdb_wait_for_event (int block)
else else
timeout = 0; timeout = 0;
num_found = poll (gdb_notifier.poll_fds, num_found = poll (gdb_notifier.poll_fds.data (),
(unsigned long) gdb_notifier.num_fds, timeout); (unsigned long) gdb_notifier.num_fds, timeout);
/* Don't print anything if we get out of poll because of a /* Don't print anything if we get out of poll because of a
@@ -676,7 +655,7 @@ gdb_wait_for_event (int block)
i = gdb_notifier.next_poll_fds_index++; i = gdb_notifier.next_poll_fds_index++;
gdb_assert (i < gdb_notifier.num_fds); gdb_assert (i < gdb_notifier.num_fds);
if ((gdb_notifier.poll_fds + i)->revents) if (gdb_notifier.poll_fds[i].revents)
break; break;
} }
@@ -684,12 +663,12 @@ gdb_wait_for_event (int block)
file_ptr != NULL; file_ptr != NULL;
file_ptr = file_ptr->next_file) file_ptr = file_ptr->next_file)
{ {
if (file_ptr->fd == (gdb_notifier.poll_fds + i)->fd) if (file_ptr->fd == gdb_notifier.poll_fds[i].fd)
break; break;
} }
gdb_assert (file_ptr != NULL); gdb_assert (file_ptr != NULL);
mask = (gdb_notifier.poll_fds + i)->revents; mask = gdb_notifier.poll_fds[i].revents;
handle_file_event (file_ptr, mask); handle_file_event (file_ptr, mask);
return 1; return 1;
} }