qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PATCH v3 4/6] util/osdep: Introduce qemu_close_range()


From: Bin Meng
Subject: Re: [PATCH v3 4/6] util/osdep: Introduce qemu_close_range()
Date: Wed, 28 Jun 2023 15:12:26 +0000
User-agent: eM_Client/9.2.1735.0

On 2023/6/19 17:18:53, "Claudio Imbrenda" <imbrenda@linux.ibm.com> wrote:

On Sat, 17 Jun 2023 13:36:19 +0800
Bin Meng <bmeng@tinylab.org> wrote:

 This introduces a new QEMU API qemu_close_range() that closes all
 open file descriptors from first to last (included).

 This API will try a more efficient call to close_range(), or walk
 through of /proc/self/fd whenever these are possible, otherwise it
 falls back to a plain close loop.

 Co-developed-by: Zhangjin Wu <falcon@tinylab.org>
 Signed-off-by: Bin Meng <bmeng@tinylab.org>

 ---

 Changes in v3:
 - fix win32 build failure

 Changes in v2:
 - new patch: "util/osdep: Introduce qemu_close_range()"

  include/qemu/osdep.h |  1 +
  util/osdep.c         | 48 ++++++++++++++++++++++++++++++++++++++++++++
  2 files changed, 49 insertions(+)

 diff --git a/include/qemu/osdep.h b/include/qemu/osdep.h
 index cc61b00ba9..e22434ce10 100644
 --- a/include/qemu/osdep.h
 +++ b/include/qemu/osdep.h
 @@ -560,6 +560,7 @@ int qemu_open_old(const char *name, int flags, ...);
  int qemu_open(const char *name, int flags, Error **errp);
  int qemu_create(const char *name, int flags, mode_t mode, Error **errp);
  int qemu_close(int fd);
 +int qemu_close_range(unsigned int first, unsigned int last);
  int qemu_unlink(const char *name);
  #ifndef _WIN32
  int qemu_dup_flags(int fd, int flags);
 diff --git a/util/osdep.c b/util/osdep.c
 index e996c4744a..91275e70f8 100644
 --- a/util/osdep.c
 +++ b/util/osdep.c
 @@ -30,6 +30,7 @@
  #include "qemu/mprotect.h"
  #include "qemu/hw-version.h"
  #include "monitor/monitor.h"
 +#include <dirent.h>

  static const char *hw_version = QEMU_HW_VERSION;

 @@ -411,6 +412,53 @@ int qemu_close(int fd)
      return close(fd);
  }

 +int qemu_close_range(unsigned int first, unsigned int last)
 +{
 +    DIR *dir = NULL;
 +
 +#ifdef CONFIG_CLOSE_RANGE
 +    int r = close_range(first, last, 0);
 +    if (!r) {
 +        /* Success, no need to try other ways. */
 +        return 0;
 +    }
 +#endif
 +
 +#ifdef __linux__
 +    dir = opendir("/proc/self/fd");
 +#endif
 +    if (!dir) {
 +        /*
 +         * If /proc is not mounted or /proc/self/fd is not supported,
 +         * try close() from first to last.
 +         */
 +        for (int i = first; i <= last; i++) {
 +            close(i);

will this compile on windows?

Yes, it will.

Regards,
Bin



reply via email to

[Prev in Thread] Current Thread [Next in Thread]