Patchwork [3/5] char: Add framework for a 'write unblocked' callback

login
register
mail settings
Submitter Amit Shah
Date Jan. 11, 2011, 11:10 a.m.
Message ID <3b7fddd6f8538bfdcb01f46935f4fc0760296ea6.1294743490.git.amit.shah@redhat.com>
Download mbox | patch
Permalink /patch/78371/
State New
Headers show

Comments

Amit Shah - Jan. 11, 2011, 11:10 a.m.
The char layer can let users know that the driver will block on further
input.  For users interested in not blocking, they can assign a function
pointer that will be called back when the driver becomes writable.  This
patch just adds the function pointers to the CharDriverState structure,
future patches will enable the nonblocking and callback functionality.

Signed-off-by: Amit Shah <amit.shah@redhat.com>
---
 qemu-char.c |    3 +++
 qemu-char.h |    5 +++++
 2 files changed, 8 insertions(+), 0 deletions(-)
Gerd Hoffmann - Jan. 11, 2011, 2:43 p.m.
Hi,

> @@ -60,6 +60,9 @@ struct CharDriverState {
>       IOEventHandler *chr_event;
>       IOCanReadHandler *chr_can_read;
>       IOReadHandler *chr_read;
> +    IOHandler *chr_write_unblocked;
> +    void (*update_fd_handlers)(struct CharDriverState *chr,
> +                               bool poll_out);

I think you don't need that callback in the first place if you are able 
to just enable/disable the handlers for a file handle.

cheers,
   Gerd

Patch

diff --git a/qemu-char.c b/qemu-char.c
index 2420b6b..9a132b6 100644
--- a/qemu-char.c
+++ b/qemu-char.c
@@ -202,11 +202,14 @@  void qemu_chr_add_handlers(CharDriverState *s,
     }
     s->chr_can_read = handlers->fd_can_read;
     s->chr_read = handlers->fd_read;
+    s->chr_write_unblocked = handlers->fd_write_unblocked;
     s->chr_event = handlers->fd_event;
     s->handler_opaque = opaque;
     if (s->chr_update_read_handler)
         s->chr_update_read_handler(s);
 
+    s->write_blocked = false;
+
     /* We're connecting to an already opened device, so let's make sure we
        also get the open event */
     if (s->opened) {
diff --git a/qemu-char.h b/qemu-char.h
index 8ed0ffd..0c2c445 100644
--- a/qemu-char.h
+++ b/qemu-char.h
@@ -60,6 +60,9 @@  struct CharDriverState {
     IOEventHandler *chr_event;
     IOCanReadHandler *chr_can_read;
     IOReadHandler *chr_read;
+    IOHandler *chr_write_unblocked;
+    void (*update_fd_handlers)(struct CharDriverState *chr,
+                               bool poll_out);
     void *handler_opaque;
     void (*chr_send_event)(struct CharDriverState *chr, int event);
     void (*chr_close)(struct CharDriverState *chr);
@@ -69,6 +72,8 @@  struct CharDriverState {
     char *label;
     char *filename;
     int opened;
+    /* Are we in a blocked state? */
+    bool write_blocked;
     QTAILQ_ENTRY(CharDriverState) next;
 };