qemu-devel.nongnu.org archive mirror
 help / color / mirror / Atom feed
From: Peter Xu <peterx@redhat.com>
To: qemu-devel@nongnu.org
Cc: "Paolo Bonzini" <pbonzini@redhat.com>,
	"Daniel P . Berrange" <berrange@redhat.com>,
	"Juan Quintela" <quintela@redhat.com>,
	peterx@redhat.com,
	"Marc-André Lureau" <marcandre.lureau@redhat.com>,
	"Markus Armbruster" <armbru@redhat.com>,
	"Stefan Hajnoczi" <stefanha@redhat.com>,
	"Dr . David Alan Gilbert" <dgilbert@redhat.com>
Subject: [Qemu-devel] [PATCH v2 03/15] qio: introduce qio_channel_add_watch_{full|source}
Date: Thu,  1 Mar 2018 16:44:26 +0800	[thread overview]
Message-ID: <20180301084438.13594-4-peterx@redhat.com> (raw)
In-Reply-To: <20180301084438.13594-1-peterx@redhat.com>

Firstly, introduce an internal qio_channel_add_watch_full(), which
enhances qio_channel_add_watch() that context can be specified.

Then add a new API wrapper qio_channel_add_watch_source() to return a
GSource pointer rather than a tag ID.

Note that the _source() call will keep a reference of GSource so that
callers need to unref them explicitly when finished using the GSource.

Signed-off-by: Peter Xu <peterx@redhat.com>
---
 include/io/channel.h | 44 ++++++++++++++++++++++++++++++++++++++++++++
 io/channel.c         | 40 ++++++++++++++++++++++++++++++++++------
 2 files changed, 78 insertions(+), 6 deletions(-)

diff --git a/include/io/channel.h b/include/io/channel.h
index 3995e243a3..e8cdadb0b0 100644
--- a/include/io/channel.h
+++ b/include/io/channel.h
@@ -648,6 +648,50 @@ guint qio_channel_add_watch(QIOChannel *ioc,
                             gpointer user_data,
                             GDestroyNotify notify);
 
+/**
+ * qio_channel_add_watch_full:
+ * @ioc: the channel object
+ * @condition: the I/O condition to monitor
+ * @func: callback to invoke when the source becomes ready
+ * @user_data: opaque data to pass to @func
+ * @notify: callback to free @user_data
+ * @context: the context to run the watch source
+ *
+ * Similar as qio_channel_add_watch(), but allows to specify context
+ * to run the watch source.
+ *
+ * Returns: the source ID
+ */
+guint qio_channel_add_watch_full(QIOChannel *ioc,
+                                 GIOCondition condition,
+                                 QIOChannelFunc func,
+                                 gpointer user_data,
+                                 GDestroyNotify notify,
+                                 GMainContext *context);
+
+/**
+ * qio_channel_add_watch_source:
+ * @ioc: the channel object
+ * @condition: the I/O condition to monitor
+ * @func: callback to invoke when the source becomes ready
+ * @user_data: opaque data to pass to @func
+ * @notify: callback to free @user_data
+ * @context: gcontext to bind the source to
+ *
+ * Similar as qio_channel_add_watch(), but allows to specify context
+ * to run the watch source, meanwhile return the GSource object
+ * instead of tag ID, with the GSource referenced already.
+ *
+ * Note: callers is responsible to unref the source when not needed.
+ *
+ * Returns: the source pointer
+ */
+GSource *qio_channel_add_watch_source(QIOChannel *ioc,
+                                      GIOCondition condition,
+                                      QIOChannelFunc func,
+                                      gpointer user_data,
+                                      GDestroyNotify notify,
+                                      GMainContext *context);
 
 /**
  * qio_channel_attach_aio_context:
diff --git a/io/channel.c b/io/channel.c
index ec4b86de7c..8dd0684f5d 100644
--- a/io/channel.c
+++ b/io/channel.c
@@ -299,11 +299,12 @@ void qio_channel_set_aio_fd_handler(QIOChannel *ioc,
     klass->io_set_aio_fd_handler(ioc, ctx, io_read, io_write, opaque);
 }
 
-guint qio_channel_add_watch(QIOChannel *ioc,
-                            GIOCondition condition,
-                            QIOChannelFunc func,
-                            gpointer user_data,
-                            GDestroyNotify notify)
+guint qio_channel_add_watch_full(QIOChannel *ioc,
+                                 GIOCondition condition,
+                                 QIOChannelFunc func,
+                                 gpointer user_data,
+                                 GDestroyNotify notify,
+                                 GMainContext *context)
 {
     GSource *source;
     guint id;
@@ -312,12 +313,39 @@ guint qio_channel_add_watch(QIOChannel *ioc,
 
     g_source_set_callback(source, (GSourceFunc)func, user_data, notify);
 
-    id = g_source_attach(source, NULL);
+    id = g_source_attach(source, context);
     g_source_unref(source);
 
     return id;
 }
 
+guint qio_channel_add_watch(QIOChannel *ioc,
+                            GIOCondition condition,
+                            QIOChannelFunc func,
+                            gpointer user_data,
+                            GDestroyNotify notify)
+{
+    return qio_channel_add_watch_full(ioc, condition, func,
+                                      user_data, notify, NULL);
+}
+
+GSource *qio_channel_add_watch_source(QIOChannel *ioc,
+                                      GIOCondition condition,
+                                      QIOChannelFunc func,
+                                      gpointer user_data,
+                                      GDestroyNotify notify,
+                                      GMainContext *context)
+{
+    GSource *source;
+    guint id;
+
+    id = qio_channel_add_watch_full(ioc, condition, func,
+                                    user_data, notify, context);
+    source = g_main_context_find_source_by_id(context, id);
+    g_source_ref(source);
+    return source;
+}
+
 
 int qio_channel_shutdown(QIOChannel *ioc,
                          QIOChannelShutdown how,
-- 
2.14.3

  parent reply	other threads:[~2018-03-01  8:45 UTC|newest]

Thread overview: 62+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2018-03-01  8:44 [Qemu-devel] [PATCH v2 00/15] qio: general non-default GMainContext support Peter Xu
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 01/15] chardev: fix leak in tcp_chr_telnet_init_io() Peter Xu
2018-03-01 17:39   ` Paolo Bonzini
2018-03-02  3:46     ` Peter Xu
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 02/15] qio: rename qio_task_thread_result Peter Xu
2018-03-01  8:44 ` Peter Xu [this message]
2018-03-01 15:37   ` [Qemu-devel] [PATCH v2 03/15] qio: introduce qio_channel_add_watch_{full|source} Daniel P. Berrangé
2018-03-01 17:13   ` Paolo Bonzini
2018-03-02  3:54     ` Peter Xu
2018-03-02 11:15       ` Paolo Bonzini
2018-03-02 15:44     ` Daniel P. Berrangé
2018-03-02 15:53       ` Paolo Bonzini
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 04/15] migration: let incoming side use thread context Peter Xu
2018-03-01 16:03   ` Daniel P. Berrangé
2018-03-02  3:56     ` Peter Xu
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 05/15] qio: refactor net listener source operations Peter Xu
2018-03-01 10:47   ` Daniel P. Berrangé
2018-03-02  3:58     ` Peter Xu
2018-03-02  4:04       ` Peter Xu
2018-03-02 10:51       ` Daniel P. Berrangé
2018-03-05  5:34         ` Peter Xu
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 06/15] qio: store gsources for net listeners Peter Xu
2018-03-01 15:40   ` Daniel P. Berrangé
2018-03-01 17:12   ` Paolo Bonzini
2018-03-02  4:10     ` Peter Xu
2018-03-02  4:59     ` Peter Xu
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 07/15] qio/chardev: update net listener gcontext Peter Xu
2018-03-01 15:43   ` Daniel P. Berrangé
2018-03-02  4:26     ` Peter Xu
2018-03-02 11:17       ` Paolo Bonzini
2018-03-05  5:43         ` Peter Xu
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 08/15] chardev: allow telnet gsource to switch gcontext Peter Xu
2018-03-01 15:46   ` Daniel P. Berrangé
2018-03-01 17:16     ` Paolo Bonzini
2018-03-02  4:37       ` Peter Xu
2018-03-02 11:02       ` Daniel P. Berrangé
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 09/15] qio: non-default context for threaded qtask Peter Xu
2018-03-01 15:47   ` Daniel P. Berrangé
2018-03-01 17:18   ` Paolo Bonzini
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 10/15] qio: non-default context for async conn Peter Xu
2018-03-01 15:48   ` Daniel P. Berrangé
2018-03-02  5:01     ` Peter Xu
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 11/15] qio: non-default context for TLS handshake Peter Xu
2018-03-01 15:50   ` Daniel P. Berrangé
2018-03-02  6:18     ` Peter Xu
2018-03-01 17:22   ` Paolo Bonzini
2018-03-02  6:09     ` Peter Xu
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 12/15] chardev: introduce chr_machine_done hook Peter Xu
2018-03-01 17:38   ` Paolo Bonzini
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 13/15] char: use chardev's gcontext for async connect Peter Xu
2018-03-01 17:38   ` Paolo Bonzini
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 14/15] chardev: tcp: postpone async connection setup Peter Xu
2018-03-01 16:01   ` Daniel P. Berrangé
2018-03-02  6:27     ` Peter Xu
2018-03-01 17:38   ` Paolo Bonzini
2018-03-01  8:44 ` [Qemu-devel] [PATCH v2 15/15] chardev: tcp: postpone TLS work until machine done Peter Xu
2018-03-01 16:03   ` Daniel P. Berrangé
2018-03-02  6:34     ` Peter Xu
2018-03-01 17:37   ` Paolo Bonzini
2018-03-02  6:43     ` Peter Xu
2018-03-01 16:07 ` [Qemu-devel] [PATCH v2 00/15] qio: general non-default GMainContext support Daniel P. Berrangé
2018-03-02  6:48   ` Peter Xu

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=20180301084438.13594-4-peterx@redhat.com \
    --to=peterx@redhat.com \
    --cc=armbru@redhat.com \
    --cc=berrange@redhat.com \
    --cc=dgilbert@redhat.com \
    --cc=marcandre.lureau@redhat.com \
    --cc=pbonzini@redhat.com \
    --cc=qemu-devel@nongnu.org \
    --cc=quintela@redhat.com \
    --cc=stefanha@redhat.com \
    /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: link
Be 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 NNTP newsgroup(s).