forked from Imagelibrary/binutils-gdb
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:
@@ -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. */
|
return item.fd == fd;
|
||||||
|
});
|
||||||
new_poll_fds = (struct pollfd *)
|
gdb_notifier.poll_fds.erase (iter, gdb_notifier.poll_fds.end());
|
||||||
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;
|
|
||||||
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;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user