public inbox for gdb-cvs@sourceware.org help / color / mirror / Atom feed
From: Tom Tromey <tromey@sourceware.org> To: gdb-cvs@sourceware.org Subject: [binutils-gdb] Use std::vector in event-loop.cc Date: Mon, 22 Apr 2024 01:55:56 +0000 (GMT) [thread overview] Message-ID: <20240422015556.C78FD3858D32@sourceware.org> (raw) https://sourceware.org/git/gitweb.cgi?p=binutils-gdb.git;h=1f984aabf17f558d04d3cf1c1b643fd44e8348e8 commit 1f984aabf17f558d04d3cf1c1b643fd44e8348e8 Author: Tom Tromey <tom@tromey.com> Date: Sat Apr 6 12:37:37 2024 -0600 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> Diff: --- gdbsupport/event-loop.cc | 57 +++++++++++++++--------------------------------- 1 file changed, 18 insertions(+), 39 deletions(-) diff --git a/gdbsupport/event-loop.cc b/gdbsupport/event-loop.cc index b18a9fdaac0..4f7ad36d8d6 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; }
reply other threads:[~2024-04-22 1:55 UTC|newest] Thread overview: [no followups] expand[flat|nested] mbox.gz Atom feed
Reply instructions: You may reply publicly to this message via plain-text email using any one of the following methods: * Save the following mbox file, import it into your mail client, and reply-to-all from there: mbox Avoid top-posting and favor interleaved quoting: https://en.wikipedia.org/wiki/Posting_style#Interleaved_style * Reply using the --to, --cc, and --in-reply-to switches of git-send-email(1): git send-email \ --in-reply-to=20240422015556.C78FD3858D32@sourceware.org \ --to=tromey@sourceware.org \ --cc=gdb-cvs@sourceware.org \ /path/to/YOUR_REPLY https://kernel.org/pub/software/scm/git/docs/git-send-email.html * If your mail client supports setting the In-Reply-To header via mailto: links, try the mailto: linkBe sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions for how to clone and mirror all data and code used for this inbox; as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).