qemu with hax to log dma reads & writes jcs.org/2018/11/12/vfio

qio: store gsources for net listeners

Originally we were storing the GSources tag IDs. That'll be not enough
if we are going to support non-default gcontext for QIO code. Switch to
GSources without changing anything real. Now we still always pass in
NULL, which means the default gcontext.

Signed-off-by: Peter Xu <peterx@redhat.com>
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com>

authored by

Peter Xu and committed by
Daniel P. Berrangé
938c8b79 315409c7

+56 -24
+20 -2
include/io/net-listener.h
··· 53 53 54 54 char *name; 55 55 QIOChannelSocket **sioc; 56 - gulong *io_tag; 56 + GSource **io_source; 57 57 size_t nsioc; 58 58 59 59 bool connected; ··· 120 120 QIOChannelSocket *sioc); 121 121 122 122 /** 123 - * qio_net_listener_set_client_func: 123 + * qio_net_listener_set_client_func_full: 124 124 * @listener: the network listener object 125 125 * @func: the callback function 126 126 * @data: opaque data to pass to @func 127 127 * @notify: callback to free @data 128 + * @context: the context that the sources will be bound to. If %NULL, 129 + * the default context will be used. 128 130 * 129 131 * Register @func to be invoked whenever a new client 130 132 * connects to the listener. @func will be invoked 131 133 * passing in the QIOChannelSocket instance for the 132 134 * client. 135 + */ 136 + void qio_net_listener_set_client_func_full(QIONetListener *listener, 137 + QIONetListenerClientFunc func, 138 + gpointer data, 139 + GDestroyNotify notify, 140 + GMainContext *context); 141 + 142 + /** 143 + * qio_net_listener_set_client_func: 144 + * @listener: the network listener object 145 + * @func: the callback function 146 + * @data: opaque data to pass to @func 147 + * @notify: callback to free @data 148 + * 149 + * Wrapper of qio_net_listener_set_client_func_full(), only that the 150 + * sources will always be bound to default main context. 133 151 */ 134 152 void qio_net_listener_set_client_func(QIONetListener *listener, 135 153 QIONetListenerClientFunc func,
+36 -22
io/net-listener.c
··· 118 118 119 119 listener->sioc = g_renew(QIOChannelSocket *, listener->sioc, 120 120 listener->nsioc + 1); 121 - listener->io_tag = g_renew(gulong, listener->io_tag, listener->nsioc + 1); 121 + listener->io_source = g_renew(typeof(listener->io_source[0]), 122 + listener->io_source, 123 + listener->nsioc + 1); 122 124 listener->sioc[listener->nsioc] = sioc; 123 - listener->io_tag[listener->nsioc] = 0; 125 + listener->io_source[listener->nsioc] = NULL; 124 126 125 127 object_ref(OBJECT(sioc)); 126 128 listener->connected = true; 127 129 128 130 if (listener->io_func != NULL) { 129 131 object_ref(OBJECT(listener)); 130 - listener->io_tag[listener->nsioc] = qio_channel_add_watch( 132 + listener->io_source[listener->nsioc] = qio_channel_add_watch_source( 131 133 QIO_CHANNEL(listener->sioc[listener->nsioc]), G_IO_IN, 132 134 qio_net_listener_channel_func, 133 - listener, (GDestroyNotify)object_unref); 135 + listener, (GDestroyNotify)object_unref, NULL); 134 136 } 135 137 136 138 listener->nsioc++; 137 139 } 138 140 139 141 140 - void qio_net_listener_set_client_func(QIONetListener *listener, 141 - QIONetListenerClientFunc func, 142 - gpointer data, 143 - GDestroyNotify notify) 142 + void qio_net_listener_set_client_func_full(QIONetListener *listener, 143 + QIONetListenerClientFunc func, 144 + gpointer data, 145 + GDestroyNotify notify, 146 + GMainContext *context) 144 147 { 145 148 size_t i; 146 149 ··· 152 155 listener->io_notify = notify; 153 156 154 157 for (i = 0; i < listener->nsioc; i++) { 155 - if (listener->io_tag[i]) { 156 - g_source_remove(listener->io_tag[i]); 157 - listener->io_tag[i] = 0; 158 + if (listener->io_source[i]) { 159 + g_source_destroy(listener->io_source[i]); 160 + g_source_unref(listener->io_source[i]); 161 + listener->io_source[i] = NULL; 158 162 } 159 163 } 160 164 161 165 if (listener->io_func != NULL) { 162 166 for (i = 0; i < listener->nsioc; i++) { 163 167 object_ref(OBJECT(listener)); 164 - listener->io_tag[i] = qio_channel_add_watch( 168 + listener->io_source[i] = qio_channel_add_watch_source( 165 169 QIO_CHANNEL(listener->sioc[i]), G_IO_IN, 166 170 qio_net_listener_channel_func, 167 - listener, (GDestroyNotify)object_unref); 171 + listener, (GDestroyNotify)object_unref, context); 168 172 } 169 173 } 170 174 } 171 175 176 + void qio_net_listener_set_client_func(QIONetListener *listener, 177 + QIONetListenerClientFunc func, 178 + gpointer data, 179 + GDestroyNotify notify) 180 + { 181 + qio_net_listener_set_client_func_full(listener, func, data, 182 + notify, NULL); 183 + } 172 184 173 185 struct QIONetListenerClientWaitData { 174 186 QIOChannelSocket *sioc; ··· 211 223 size_t i; 212 224 213 225 for (i = 0; i < listener->nsioc; i++) { 214 - if (listener->io_tag[i]) { 215 - g_source_remove(listener->io_tag[i]); 216 - listener->io_tag[i] = 0; 226 + if (listener->io_source[i]) { 227 + g_source_destroy(listener->io_source[i]); 228 + g_source_unref(listener->io_source[i]); 229 + listener->io_source[i] = NULL; 217 230 } 218 231 } 219 232 ··· 241 254 if (listener->io_func != NULL) { 242 255 for (i = 0; i < listener->nsioc; i++) { 243 256 object_ref(OBJECT(listener)); 244 - listener->io_tag[i] = qio_channel_add_watch( 257 + listener->io_source[i] = qio_channel_add_watch_source( 245 258 QIO_CHANNEL(listener->sioc[i]), G_IO_IN, 246 259 qio_net_listener_channel_func, 247 - listener, (GDestroyNotify)object_unref); 260 + listener, (GDestroyNotify)object_unref, NULL); 248 261 } 249 262 } 250 263 ··· 260 273 } 261 274 262 275 for (i = 0; i < listener->nsioc; i++) { 263 - if (listener->io_tag[i]) { 264 - g_source_remove(listener->io_tag[i]); 265 - listener->io_tag[i] = 0; 276 + if (listener->io_source[i]) { 277 + g_source_destroy(listener->io_source[i]); 278 + g_source_unref(listener->io_source[i]); 279 + listener->io_source[i] = NULL; 266 280 } 267 281 qio_channel_close(QIO_CHANNEL(listener->sioc[i]), NULL); 268 282 } ··· 285 299 for (i = 0; i < listener->nsioc; i++) { 286 300 object_unref(OBJECT(listener->sioc[i])); 287 301 } 288 - g_free(listener->io_tag); 302 + g_free(listener->io_source); 289 303 g_free(listener->sioc); 290 304 g_free(listener->name); 291 305 }