qemu-devel
[Top][All Lists]
Advanced

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

Re: [Qemu-devel] [PATCH 05/13] char-win: close file handle except with c


From: Philippe Mathieu-Daudé
Subject: Re: [Qemu-devel] [PATCH 05/13] char-win: close file handle except with console
Date: Fri, 26 May 2017 12:30:11 -0300
User-agent: Mozilla/5.0 (X11; Linux x86_64; rv:45.0) Gecko/20100101 Thunderbird/45.8.0

Hi Marc-André,

On 05/09/2017 08:33 AM, Marc-André Lureau wrote:
Only the console handle shouldn't be closed, however, the "file" handle
should.

Correct.


Signed-off-by: Marc-André Lureau <address@hidden>
---
 chardev/char-win.h     |  5 ++---
 chardev/char-console.c |  2 +-
 chardev/char-file.c    |  2 +-
 chardev/char-win.c     | 12 ++++--------
 4 files changed, 8 insertions(+), 13 deletions(-)

diff --git a/chardev/char-win.h b/chardev/char-win.h
index 888be2b3ca..9ed2ba998a 100644
--- a/chardev/char-win.h
+++ b/chardev/char-win.h
@@ -29,14 +29,13 @@
 typedef struct {
     Chardev parent;

+    bool dont_close; /* console do not close file */

That or "keep_open" to avoid negative thoughts ;)

Anyway:
Reviewed-by: Philippe Mathieu-Daudé <address@hidden>

     HANDLE file, hrecv, hsend;
     OVERLAPPED orecv;
     BOOL fpipe;

     /* Protected by the Chardev chr_write_lock.  */
     OVERLAPPED osend;
-    /* FIXME: file/console do not finalize */
-    bool skip_free;
 } WinChardev;

 #define NSENDBUF 2048
@@ -45,7 +44,7 @@ typedef struct {
 #define TYPE_CHARDEV_WIN "chardev-win"
 #define WIN_CHARDEV(obj) OBJECT_CHECK(WinChardev, (obj), TYPE_CHARDEV_WIN)

-void qemu_chr_open_win_file(Chardev *chr, HANDLE fd_out);
+void win_chr_set_file(Chardev *chr, HANDLE file, bool dont_close);
 int win_chr_serial_init(Chardev *chr, const char *filename, Error **errp);
 int win_chr_pipe_poll(void *opaque);

diff --git a/chardev/char-console.c b/chardev/char-console.c
index c824937fe6..8d972c1506 100644
--- a/chardev/char-console.c
+++ b/chardev/char-console.c
@@ -29,7 +29,7 @@ static void qemu_chr_open_win_con(Chardev *chr,
                                   bool *be_opened,
                                   Error **errp)
 {
-    qemu_chr_open_win_file(chr, GetStdHandle(STD_OUTPUT_HANDLE));
+    win_chr_set_file(chr, GetStdHandle(STD_OUTPUT_HANDLE), true);
 }

 static void char_console_class_init(ObjectClass *oc, void *data)
diff --git a/chardev/char-file.c b/chardev/char-file.c
index 8bae25350d..aed4ae1569 100644
--- a/chardev/char-file.c
+++ b/chardev/char-file.c
@@ -65,7 +65,7 @@ static void qmp_chardev_open_file(Chardev *chr,
         return;
     }

-    qemu_chr_open_win_file(chr, out);
+    win_chr_set_file(chr, out, false);
 #else
     int flags, in = -1, out;

diff --git a/chardev/char-win.c b/chardev/char-win.c
index a7e3296909..24cf364947 100644
--- a/chardev/char-win.c
+++ b/chardev/char-win.c
@@ -192,17 +192,13 @@ static void char_win_finalize(Object *obj)
     Chardev *chr = CHARDEV(obj);
     WinChardev *s = WIN_CHARDEV(chr);

-    if (s->skip_free) {
-        return;
-    }
-
     if (s->hsend) {
         CloseHandle(s->hsend);
     }
     if (s->hrecv) {
         CloseHandle(s->hrecv);
     }
-    if (s->file) {
+    if (!s->dont_close && s->file) {
         CloseHandle(s->file);
     }
     if (s->fpipe) {
@@ -214,12 +210,12 @@ static void char_win_finalize(Object *obj)
     qemu_chr_be_event(chr, CHR_EVENT_CLOSED);
 }

-void qemu_chr_open_win_file(Chardev *chr, HANDLE fd_out)
+void win_chr_set_file(Chardev *chr, HANDLE file, bool dont_close)
 {
     WinChardev *s = WIN_CHARDEV(chr);

-    s->skip_free = true;
-    s->file = fd_out;
+    s->dont_close = dont_close;
+    s->file = file;
 }

 static void char_win_class_init(ObjectClass *oc, void *data)




reply via email to

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