diff options
author | Tom Tromey <tom@tromey.com> | 2024-04-06 12:37:37 -0600 |
---|---|---|
committer | Tom Tromey <tom@tromey.com> | 2024-04-21 19:54:27 -0600 |
commit | 1f984aabf17f558d04d3cf1c1b643fd44e8348e8 (patch) | |
tree | 0d7a1eead378caba43406c6870db603cfadabdbd | |
parent | b5247082c4a71f69ba53e5b076409f25918d953f (diff) | |
download | gdb-1f984aabf17f558d04d3cf1c1b643fd44e8348e8.zip gdb-1f984aabf17f558d04d3cf1c1b643fd44e8348e8.tar.gz gdb-1f984aabf17f558d04d3cf1c1b643fd44e8348e8.tar.bz2 |
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>
-rw-r--r-- | gdbsupport/event-loop.cc | 57 |
1 files changed, 18 insertions, 39 deletions
diff --git a/gdbsupport/event-loop.cc b/gdbsupport/event-loop.cc index b18a9fd..4f7ad36 100644 --- a/gdbsupport/event-loop.cc +++ b/gdbsupport/event-loop.cc @@ -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; } |