mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 01:53:38 +08:00
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:
parent
b5247082c4
commit
1f984aabf1
@ -112,8 +112,8 @@ static struct
|
||||
file_handler *next_file_handler;
|
||||
|
||||
#ifdef HAVE_POLL
|
||||
/* Ptr to array of pollfd structures. */
|
||||
struct pollfd *poll_fds;
|
||||
/* Descriptors to poll. */
|
||||
std::vector<struct pollfd> poll_fds;
|
||||
|
||||
/* Next file descriptor to handle, for the poll variant. To level
|
||||
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)
|
||||
{
|
||||
gdb_notifier.num_fds++;
|
||||
if (gdb_notifier.poll_fds)
|
||||
gdb_notifier.poll_fds =
|
||||
(struct pollfd *) xrealloc (gdb_notifier.poll_fds,
|
||||
(gdb_notifier.num_fds
|
||||
* sizeof (struct pollfd)));
|
||||
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;
|
||||
struct pollfd new_fd;
|
||||
new_fd.fd = fd;
|
||||
new_fd.events = mask;
|
||||
new_fd.revents = 0;
|
||||
gdb_notifier.poll_fds.push_back (new_fd);
|
||||
}
|
||||
else
|
||||
#endif /* HAVE_POLL */
|
||||
@ -426,28 +420,13 @@ delete_file_handler (int fd)
|
||||
#ifdef HAVE_POLL
|
||||
if (use_poll)
|
||||
{
|
||||
int j;
|
||||
struct pollfd *new_poll_fds;
|
||||
|
||||
/* 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)
|
||||
{
|
||||
(new_poll_fds + j)->fd = (gdb_notifier.poll_fds + i)->fd;
|
||||
(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;
|
||||
auto iter = std::remove_if (gdb_notifier.poll_fds.begin (),
|
||||
gdb_notifier.poll_fds.end (),
|
||||
[=] (const pollfd &item)
|
||||
{
|
||||
return item.fd == fd;
|
||||
});
|
||||
gdb_notifier.poll_fds.erase (iter, gdb_notifier.poll_fds.end());
|
||||
gdb_notifier.num_fds--;
|
||||
}
|
||||
else
|
||||
@ -605,7 +584,7 @@ gdb_wait_for_event (int block)
|
||||
else
|
||||
timeout = 0;
|
||||
|
||||
num_found = poll (gdb_notifier.poll_fds,
|
||||
num_found = poll (gdb_notifier.poll_fds.data (),
|
||||
(unsigned long) gdb_notifier.num_fds, timeout);
|
||||
|
||||
/* 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++;
|
||||
|
||||
gdb_assert (i < gdb_notifier.num_fds);
|
||||
if ((gdb_notifier.poll_fds + i)->revents)
|
||||
if (gdb_notifier.poll_fds[i].revents)
|
||||
break;
|
||||
}
|
||||
|
||||
@ -684,12 +663,12 @@ gdb_wait_for_event (int block)
|
||||
file_ptr != NULL;
|
||||
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;
|
||||
}
|
||||
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);
|
||||
return 1;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user