diff options
author | Daniel P. Berrange <berrange@redhat.com> | 2013-12-03 15:24:17 +0000 |
---|---|---|
committer | Daniel P. Berrange <berrange@redhat.com> | 2013-12-04 14:52:48 +0000 |
commit | 7f842365b192a514be30512c4f96abdbef9702a0 (patch) | |
tree | 533d65cb7740674cddc510c6a19bdf42081ba0db | |
parent | 9d9e2513c09e7ba7474c94455e5f82b3d00e6396 (diff) | |
download | libvirt-python-7f842365b192a514be30512c4f96abdbef9702a0.tar.gz |
Fix use of virDomainEventRegister in python bindings
If an app used the virDomainEventRegister binding instead
of the virDomainEventRegisterAny binding, it would never
have its callback invoked. This is because the code for
dispatching from the C libvirt_virConnectDomainEventCallback
method was totally fubar.
If DEBUG macro was set in the python build the error would
become visible
"libvirt_virConnectDomainEventCallback dom_class is not a class!"
The code in libvirt_virConnectDomainEventCallback was
inexplicably complex and has apparently never worked. The
fix is to write it the same way as the other callback handlers.
Signed-off-by: Daniel P. Berrange <berrange@redhat.com>
-rw-r--r-- | libvirt-override-virConnect.py | 2 | ||||
-rw-r--r-- | libvirt-override.c | 64 |
2 files changed, 6 insertions, 60 deletions
diff --git a/libvirt-override-virConnect.py b/libvirt-override-virConnect.py index 23fadfd..0beaf9c 100644 --- a/libvirt-override-virConnect.py +++ b/libvirt-override-virConnect.py @@ -38,7 +38,7 @@ """ try: for cb,opaque in self.domainEventCallbacks.items(): - cb(self,dom,event,detail,opaque) + cb(self, virDomain(self, _obj=dom), event, detail, opaque) return 0 except AttributeError: pass diff --git a/libvirt-override.c b/libvirt-override.c index 93b9c5f..5deb414 100644 --- a/libvirt-override.c +++ b/libvirt-override.c @@ -4923,7 +4923,6 @@ cleanup: *******************************************/ static PyObject *libvirt_module = NULL; static PyObject *libvirt_dict = NULL; -static PyObject *libvirt_dom_class = NULL; static PyObject * getLibvirtModuleObject(void) { @@ -4959,23 +4958,6 @@ getLibvirtDictObject(void) { return libvirt_dict; } -static PyObject * -getLibvirtDomainClassObject(void) { - if (libvirt_dom_class) - return libvirt_dom_class; - - // PyDict_GetItemString returns a borrowed reference - libvirt_dom_class = PyDict_GetItemString(getLibvirtDictObject(), - "virDomain"); - if (!libvirt_dom_class) { - DEBUG("%s Error importing virDomain class\n", __FUNCTION__); - PyErr_Print(); - return NULL; - } - - Py_INCREF(libvirt_dom_class); - return libvirt_dom_class; -} static PyObject * libvirt_lookupPythonFunc(const char *funcname) @@ -5013,13 +4995,9 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED, { PyObject *pyobj_ret; - PyObject *pyobj_conn_inst = (PyObject*)opaque; + PyObject *pyobj_conn = (PyObject*)opaque; PyObject *pyobj_dom; - PyObject *pyobj_dom_args; - PyObject *pyobj_dom_inst; - - PyObject *dom_class; int ret = -1; LIBVIRT_ENSURE_THREAD_STATE; @@ -5027,45 +5005,15 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED, /* 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) { - DEBUG("%s error creating tuple", __FUNCTION__); - goto cleanup; - } - if (PyTuple_SetItem(pyobj_dom_args, 1, pyobj_dom) != 0) { - DEBUG("%s error creating tuple", __FUNCTION__); - goto cleanup; - } - Py_INCREF(pyobj_conn_inst); - - dom_class = getLibvirtDomainClassObject(); - if (!PyClass_Check(dom_class)) { - DEBUG("%s dom_class is not a class!\n", __FUNCTION__); - goto cleanup; - } - - pyobj_dom_inst = PyInstance_New(dom_class, - pyobj_dom_args, - NULL); - - Py_DECREF(pyobj_dom_args); - - if (!pyobj_dom_inst) { - DEBUG("%s Error creating a python instance of virDomain\n", - __FUNCTION__); - PyErr_Print(); - goto cleanup; - } /* Call the Callback Dispatcher */ - pyobj_ret = PyObject_CallMethod(pyobj_conn_inst, + pyobj_ret = PyObject_CallMethod(pyobj_conn, (char*)"_dispatchDomainEventCallbacks", (char*)"Oii", - pyobj_dom_inst, - event, - detail); + pyobj_dom, + event, detail); - Py_DECREF(pyobj_dom_inst); + Py_DECREF(pyobj_dom); if (!pyobj_ret) { DEBUG("%s - ret:%p\n", __FUNCTION__, pyobj_ret); @@ -5075,8 +5023,6 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED, ret = 0; } - -cleanup: LIBVIRT_RELEASE_THREAD_STATE; return ret; } |