From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from [140.186.70.92] (port=53092 helo=eggs.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1PDooO-0002D9-Tt for qemu-devel@nongnu.org; Wed, 03 Nov 2010 21:40:44 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1PDm7I-0005Ng-Od for qemu-devel@nongnu.org; Wed, 03 Nov 2010 18:47:42 -0400 Received: from e36.co.us.ibm.com ([32.97.110.154]:44222) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1PDm7I-0005Nc-9z for qemu-devel@nongnu.org; Wed, 03 Nov 2010 18:47:40 -0400 Received: from d03relay04.boulder.ibm.com (d03relay04.boulder.ibm.com [9.17.195.106]) by e36.co.us.ibm.com (8.14.4/8.13.1) with ESMTP id oA3MhKRx006437 for ; Wed, 3 Nov 2010 16:43:20 -0600 Received: from d03av03.boulder.ibm.com (d03av03.boulder.ibm.com [9.17.195.169]) by d03relay04.boulder.ibm.com (8.13.8/8.13.8/NCO v10.0) with ESMTP id oA3MldhU136436 for ; Wed, 3 Nov 2010 16:47:39 -0600 Received: from d03av03.boulder.ibm.com (loopback [127.0.0.1]) by d03av03.boulder.ibm.com (8.14.4/8.13.1/NCO v10.0 AVout) with ESMTP id oA3Mlc2G016062 for ; Wed, 3 Nov 2010 16:47:38 -0600 From: Adam Litke In-Reply-To: <1288798090-7127-3-git-send-email-mdroth@linux.vnet.ibm.com> References: <1288798090-7127-1-git-send-email-mdroth@linux.vnet.ibm.com> <1288798090-7127-3-git-send-email-mdroth@linux.vnet.ibm.com> Content-Type: text/plain; charset="UTF-8" Date: Wed, 03 Nov 2010 17:47:36 -0500 Message-ID: <1288824456.2846.15.camel@aglitke> Mime-Version: 1.0 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] Re: [RFC][RESEND][PATCH v1 02/15] virtproxy: qemu-vp, standalone daemon skeleton List-Id: qemu-devel.nongnu.org List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: Michael Roth Cc: abeekhof@redhat.com, agl@linux.vnet.ibm.com, qemu-devel@nongnu.org, aliguori@linux.vnet.ibm.com On Wed, 2010-11-03 at 10:27 -0500, Michael Roth wrote: > +/* mirror qemu I/O-related code for standalone daemon */ > +typedef struct IOHandlerRecord { > + int fd; > + IOCanReadHandler *fd_read_poll; > + IOHandler *fd_read; > + IOHandler *fd_write; > + int deleted; > + void *opaque; > + /* temporary data */ > + struct pollfd *ufd; > + QLIST_ENTRY(IOHandlerRecord) next; > +} IOHandlerRecord; As you say, this is exactly the same structure as defined in vl.c. If you copy and paste code for a new feature you should be looking for a way to share it instead. Why not create a separate patch that defines this structure in vl.h which can then be included by vl.c and virtproxy code. > +static QLIST_HEAD(, IOHandlerRecord) io_handlers = > + QLIST_HEAD_INITIALIZER(io_handlers); > + > +int vp_set_fd_handler2(int fd, > + IOCanReadHandler *fd_read_poll, > + IOHandler *fd_read, > + IOHandler *fd_write, > + void *opaque) > +{ > + IOHandlerRecord *ioh; > + > + if (!fd_read && !fd_write) { > + QLIST_FOREACH(ioh, &io_handlers, next) { > + if (ioh->fd == fd) { > + ioh->deleted = 1; > + break; > + } > + } > + } else { > + QLIST_FOREACH(ioh, &io_handlers, next) { > + if (ioh->fd == fd) > + goto found; > + } > + ioh = qemu_mallocz(sizeof(IOHandlerRecord)); > + QLIST_INSERT_HEAD(&io_handlers, ioh, next); > + found: > + ioh->fd = fd; > + ioh->fd_read_poll = fd_read_poll; > + ioh->fd_read = fd_read; > + ioh->fd_write = fd_write; > + ioh->opaque = opaque; > + ioh->deleted = 0; > + } > + return 0; > +} Copied from vl.c -- export it instead. > +int vp_set_fd_handler(int fd, > + IOHandler *fd_read, > + IOHandler *fd_write, > + void *opaque) > +{ > + return vp_set_fd_handler2(fd, NULL, fd_read, fd_write, opaque); > +} > + > +int vp_send_all(int fd, const void *buf, int len1) > +{ > + int ret, len; > + > + len = len1; > + while (len > 0) { > + ret = write(fd, buf, len); > + if (ret < 0) { > + if (errno != EINTR && errno != EAGAIN) { > + warn("write() failed"); > + return -1; > + } > + } else if (ret == 0) { > + break; > + } else { > + buf += ret; > + len -= ret; > + } > + } > + return len1 - len; > +} Copied from qemu-char.c -- Share please. > +static void main_loop_wait(int nonblocking) > +{ > + IOHandlerRecord *ioh; > + fd_set rfds, wfds, xfds; > + int ret, nfds; > + struct timeval tv; > + int timeout = 1000; > + > + if (nonblocking) { > + timeout = 0; > + } > + > + /* poll any events */ > + nfds = -1; > + FD_ZERO(&rfds); > + FD_ZERO(&wfds); > + FD_ZERO(&xfds); > + QLIST_FOREACH(ioh, &io_handlers, next) { > + if (ioh->deleted) > + continue; > + if (ioh->fd_read && > + (!ioh->fd_read_poll || > + ioh->fd_read_poll(ioh->opaque) != 0)) { > + FD_SET(ioh->fd, &rfds); > + if (ioh->fd > nfds) > + nfds = ioh->fd; > + } > + if (ioh->fd_write) { > + FD_SET(ioh->fd, &wfds); > + if (ioh->fd > nfds) > + nfds = ioh->fd; > + } > + } > + > + tv.tv_sec = timeout / 1000; > + tv.tv_usec = (timeout % 1000) * 1000; > + > + ret = select(nfds + 1, &rfds, &wfds, &xfds, &tv); > + > + if (ret > 0) { > + IOHandlerRecord *pioh; > + > + QLIST_FOREACH_SAFE(ioh, &io_handlers, next, pioh) { > + if (ioh->deleted) { > + QLIST_REMOVE(ioh, next); > + qemu_free(ioh); > + continue; > + } > + if (ioh->fd_read && FD_ISSET(ioh->fd, &rfds)) { > + ioh->fd_read(ioh->opaque); > + } > + if (ioh->fd_write && FD_ISSET(ioh->fd, &wfds)) { > + ioh->fd_write(ioh->opaque); > + } > + } > + } > + This resembles vl.c's main_loop_wait() but I can see why you might want your own. There is opportunity for sharing the select logic and ioh callbacks but I think that could be addressed later. -- Thanks, Adam