diff options
author | Fabiano Rosas <farosas@suse.de> | 2024-06-17 15:57:21 -0300 |
---|---|---|
committer | Fabiano Rosas <farosas@suse.de> | 2024-06-20 10:42:24 -0300 |
commit | a93ad56053e54a94875faabb042d7c60fdd2fe20 (patch) | |
tree | 109eccfc634ae880529e42cfb6f5a63a34a0d258 /monitor | |
parent | 1cd93fb0bf8b1fddab4c38e17145cc8776eadaa0 (diff) | |
download | qemu-a93ad56053e54a94875faabb042d7c60fdd2fe20.zip qemu-a93ad56053e54a94875faabb042d7c60fdd2fe20.tar.gz qemu-a93ad56053e54a94875faabb042d7c60fdd2fe20.tar.bz2 |
monitor: Introduce monitor_fdset_*free
Introduce new functions to remove and free no longer used fds and
fdsets.
We need those to decouple the remove/free routines from
monitor_fdset_cleanup() which will go away in the next patches.
The new functions:
- monitor_fdset_free/_if_empty() will be used when a monitor
connection closes and when an fd is removed to cleanup any fdset
that is now empty.
- monitor_fdset_fd_free() will be used to remove one or more fds that
have been explicitly targeted by qmp_remove_fd().
Reviewed-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Fabiano Rosas <farosas@suse.de>
Diffstat (limited to 'monitor')
-rw-r--r-- | monitor/fds.c | 31 |
1 files changed, 23 insertions, 8 deletions
diff --git a/monitor/fds.c b/monitor/fds.c index fb9f58c..bd45a26 100644 --- a/monitor/fds.c +++ b/monitor/fds.c @@ -167,6 +167,27 @@ int monitor_get_fd(Monitor *mon, const char *fdname, Error **errp) return -1; } +static void monitor_fdset_free(MonFdset *mon_fdset) +{ + QLIST_REMOVE(mon_fdset, next); + g_free(mon_fdset); +} + +static void monitor_fdset_free_if_empty(MonFdset *mon_fdset) +{ + if (QLIST_EMPTY(&mon_fdset->fds) && QLIST_EMPTY(&mon_fdset->dup_fds)) { + monitor_fdset_free(mon_fdset); + } +} + +static void monitor_fdset_fd_free(MonFdsetFd *mon_fdset_fd) +{ + close(mon_fdset_fd->fd); + g_free(mon_fdset_fd->opaque); + QLIST_REMOVE(mon_fdset_fd, next); + g_free(mon_fdset_fd); +} + static void monitor_fdset_cleanup(MonFdset *mon_fdset) { MonFdsetFd *mon_fdset_fd; @@ -176,17 +197,11 @@ static void monitor_fdset_cleanup(MonFdset *mon_fdset) if ((mon_fdset_fd->removed || (QLIST_EMPTY(&mon_fdset->dup_fds) && mon_refcount == 0)) && runstate_is_running()) { - close(mon_fdset_fd->fd); - g_free(mon_fdset_fd->opaque); - QLIST_REMOVE(mon_fdset_fd, next); - g_free(mon_fdset_fd); + monitor_fdset_fd_free(mon_fdset_fd); } } - if (QLIST_EMPTY(&mon_fdset->fds) && QLIST_EMPTY(&mon_fdset->dup_fds)) { - QLIST_REMOVE(mon_fdset, next); - g_free(mon_fdset); - } + monitor_fdset_free_if_empty(mon_fdset); } void monitor_fdsets_cleanup(void) |