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

socket: Add num connections to qio_channel_socket_async()

Reviewed-by: Daniel P. Berrangé <berrange@redhat.com>
Signed-off-by: Juan Quintela <quintela@redhat.com>

+27 -9
+2
include/io/channel-socket.h
··· 140 140 * qio_channel_socket_listen_async: 141 141 * @ioc: the socket channel object 142 142 * @addr: the address to listen to 143 + * @num: the expected ammount of connections 143 144 * @callback: the function to invoke on completion 144 145 * @opaque: user data to pass to @callback 145 146 * @destroy: the function to free @opaque ··· 155 156 */ 156 157 void qio_channel_socket_listen_async(QIOChannelSocket *ioc, 157 158 SocketAddress *addr, 159 + int num, 158 160 QIOTaskFunc callback, 159 161 gpointer opaque, 160 162 GDestroyNotify destroy,
+23 -7
io/channel-socket.c
··· 220 220 } 221 221 222 222 223 + struct QIOChannelListenWorkerData { 224 + SocketAddress *addr; 225 + int num; /* amount of expected connections */ 226 + }; 227 + 228 + static void qio_channel_listen_worker_free(gpointer opaque) 229 + { 230 + struct QIOChannelListenWorkerData *data = opaque; 231 + 232 + qapi_free_SocketAddress(data->addr); 233 + g_free(data); 234 + } 235 + 223 236 static void qio_channel_socket_listen_worker(QIOTask *task, 224 237 gpointer opaque) 225 238 { 226 239 QIOChannelSocket *ioc = QIO_CHANNEL_SOCKET(qio_task_get_source(task)); 227 - SocketAddress *addr = opaque; 240 + struct QIOChannelListenWorkerData *data = opaque; 228 241 Error *err = NULL; 229 242 230 - qio_channel_socket_listen_sync(ioc, addr, 1, &err); 243 + qio_channel_socket_listen_sync(ioc, data->addr, data->num, &err); 231 244 232 245 qio_task_set_error(task, err); 233 246 } ··· 235 248 236 249 void qio_channel_socket_listen_async(QIOChannelSocket *ioc, 237 250 SocketAddress *addr, 251 + int num, 238 252 QIOTaskFunc callback, 239 253 gpointer opaque, 240 254 GDestroyNotify destroy, ··· 242 256 { 243 257 QIOTask *task = qio_task_new( 244 258 OBJECT(ioc), callback, opaque, destroy); 245 - SocketAddress *addrCopy; 259 + struct QIOChannelListenWorkerData *data; 246 260 247 - addrCopy = QAPI_CLONE(SocketAddress, addr); 261 + data = g_new0(struct QIOChannelListenWorkerData, 1); 262 + data->addr = QAPI_CLONE(SocketAddress, addr); 263 + data->num = num; 248 264 249 265 /* socket_listen() blocks in DNS lookups, so we must use a thread */ 250 - trace_qio_channel_socket_listen_async(ioc, addr); 266 + trace_qio_channel_socket_listen_async(ioc, addr, num); 251 267 qio_task_run_in_thread(task, 252 268 qio_channel_socket_listen_worker, 253 - addrCopy, 254 - (GDestroyNotify)qapi_free_SocketAddress, 269 + data, 270 + qio_channel_listen_worker_free, 255 271 context); 256 272 } 257 273
+1 -1
io/trace-events
··· 18 18 qio_channel_socket_connect_fail(void *ioc) "Socket connect fail ioc=%p" 19 19 qio_channel_socket_connect_complete(void *ioc, int fd) "Socket connect complete ioc=%p fd=%d" 20 20 qio_channel_socket_listen_sync(void *ioc, void *addr, int num) "Socket listen sync ioc=%p addr=%p num=%d" 21 - qio_channel_socket_listen_async(void *ioc, void *addr) "Socket listen async ioc=%p addr=%p" 21 + qio_channel_socket_listen_async(void *ioc, void *addr, int num) "Socket listen async ioc=%p addr=%p num=%d" 22 22 qio_channel_socket_listen_fail(void *ioc) "Socket listen fail ioc=%p" 23 23 qio_channel_socket_listen_complete(void *ioc, int fd) "Socket listen complete ioc=%p fd=%d" 24 24 qio_channel_socket_dgram_sync(void *ioc, void *localAddr, void *remoteAddr) "Socket dgram sync ioc=%p localAddr=%p remoteAddr=%p"
+1 -1
tests/test-io-channel-socket.c
··· 113 113 114 114 lioc = qio_channel_socket_new(); 115 115 qio_channel_socket_listen_async( 116 - lioc, listen_addr, 116 + lioc, listen_addr, 1, 117 117 test_io_channel_complete, &data, NULL, NULL); 118 118 119 119 g_main_loop_run(data.loop);