On Mon, May 18, 2009 at 01:54:28PM +0100, Daniel P. Berrange wrote: > On Mon, May 18, 2009 at 01:25:35PM +0100, Daniel P. Berrange wrote: > > On Thu, May 14, 2009 at 06:43:10PM -0700, Noah Zoschke wrote: > > > Hello, > > > > > > I have been playing around with the libvirt domain event handlers in > > > Python and am seeing something surprising. I am using trunk libvirt > > > and `event-test.py` with some more of the debugging strings uncommented. > > > > > > When I trigger my first event: > > > > [snip] > > > > > So my handler is always one event behind. > > > > > > This behavior is not intended is it? Am I missing either something in > > > `event-test.py` or in how I am using virsh that would correct this > > > behavior? > > > > This is not intended behaviour. I have verified that I see the same > > problem when running the event-test.py demo program. The C based > > example event-test.c does work correctly. So either this is a bug > > in the python demo program, or a bug in the python APIs for events. > > Not sure which yet... > > The demo program is horribly broken wrt handling timeouts > > Also the python binding was not incrementing the ref count on > the domain objects it was wrapping. > > Daniel > > diff -r 08f3de2814fb examples/domain-events/events-python/event-test.py > --- a/examples/domain-events/events-python/event-test.py Mon May 18 13:15:33 2009 +0100 > +++ b/examples/domain-events/events-python/event-test.py Mon May 18 13:53:59 2009 +0100 > @@ -6,6 +6,8 @@ import select > mypoll = select.poll() > TIMEOUT_MS = 1000 > > +debug = False > + > # handle globals > h_fd = 0 > h_events = 0 > @@ -66,8 +68,9 @@ def myPollEventToEventHandleType(events) > return ret; > > def myAddHandle(fd, events, cb, opaque): > - global h_fd, h_events, h_cb, h_opaque > - #print "Adding Handle %s %s %s %s" % (str(fd), str(events), str(cb), str(opaque)) > + global h_fd, h_events, h_cb, h_opaque, debug > + if debug: > + print "Adding Handle %s %s %s %s" % (str(fd), str(events), str(cb), str(opaque)) > h_fd = fd > h_events = events > h_cb = cb > @@ -76,36 +79,48 @@ def myAddHandle(fd, events, cb, opaque): > return 0 > > def myUpdateHandle(watch, event): > - global h_fd, h_events > - #print "Updating Handle %s %s" % (str(h_fd), str(event)) > + global h_fd, h_events, debug > + if debug: > + print "Updating Handle %s %s" % (str(h_fd), str(event)) > h_events = event > mypoll.unregister(h_fd) > mypoll.register(h_fd, myEventHandleTypeToPollEvent(event)) > > def myRemoveHandle(watch): > - global h_fd > - #print "Removing Handle %s" % str(h_fd) > + global h_fd, debug > + if debug: > + print "Removing Handle %s" % str(h_fd) > mypoll.unregister(h_fd) > h_fd = 0 > return h_opaque > > def myAddTimeout(timeout, cb, opaque): > - global t_active, t_timeout, t_cb, t_opaque > - #print "Adding Timeout %s %s %s" % (str(timeout), str(cb), str(opaque)) > - t_active = 1; > + global t_active, t_timeout, t_cb, t_opaque, debug > + if debug: > + print "Adding Timeout %s %s %s" % (str(timeout), str(cb), str(opaque)) > + if timeout == -1: > + t_active = 0 > + else: > + t_active = 1 > t_timeout = timeout; > t_cb = cb; > t_opaque = opaque; > return 0 > > def myUpdateTimeout(timer, timeout): > - global t_timeout > - #print "Updating Timeout %s %s" % (str(timer), str(timeout)) > + global t_timeout, t_active, debug > + if debug: > + print "Updating Timeout %s %s" % (str(timer), str(timeout)) > + if timeout == -1: > + t_active = 0 > + else: > + t_active = 1 > t_timeout = timeout; > > def myRemoveTimeout(timer): > - global t_active > - #print "Removing Timeout %s" % str(timer) > + global t_active, debug > + if debug: > + print "Removing Timeout %s" % str(timer) > t_active = 0; > return t_opaque > > @@ -159,6 +174,8 @@ def main(): > > while 1: > try: > + if debug: > + print "Poll sleep %d" % t_active > sts = mypoll.poll(TIMEOUT_MS) > except select.error, err: > if err[0] == errno.EINTR: > @@ -168,17 +185,19 @@ def main(): > print "Keyboard Interrupt caught - exiting cleanly" > break > > + if t_cb and t_active == 1: > + if debug: > + print "Invoking Timeout CB" > + t_cb(t_timeout, t_opaque[0], t_opaque[1]) > + > if not sts: > - #print "Timed out" > + if debug: > + print "Timed out" > continue > > rfd = sts[0][0] > revents = sts[0][1] > > - if t_active: > - #print "Invoking Timeout CB" > - t_cb(t_timeout, t_opaque[0], t_opaque[1]) > - > if revents & select.POLLHUP: > print "Reset by peer"; > return -1; > diff -r 08f3de2814fb python/libvir.c > --- a/python/libvir.c Mon May 18 13:15:33 2009 +0100 > +++ b/python/libvir.c Mon May 18 13:53:59 2009 +0100 > @@ -1653,6 +1653,7 @@ libvirt_virConnectDomainEventCallback(vi > LIBVIRT_ENSURE_THREAD_STATE; > > /* Create a python instance of this virDomainPtr */ > + virDomainRef(dom); > pyobj_dom = libvirt_virDomainPtrWrap(dom); > pyobj_dom_args = PyTuple_New(2); > if(PyTuple_SetItem(pyobj_dom_args, 0, pyobj_conn_inst)!=0) { ACK, looks fine to me, Daniel -- Daniel Veillard | libxml Gnome XML XSLT toolkit http://xmlsoft.org/ daniel@xxxxxxxxxxxx | Rpmfind RPM search engine http://rpmfind.net/ http://veillard.com/ | virtualization library http://libvirt.org/ -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list