<enum name='VIR_CRED_USERNAME' file='libvirt' value='1' type='virConnectCredentialType' info='Identity to act as'/>
<enum name='VIR_DOMAIN_BLOCKED' file='libvirt' value='2' type='virDomainState' info='the domain is blocked on resource'/>
<enum name='VIR_DOMAIN_CRASHED' file='libvirt' value='6' type='virDomainState' info=' the domain is crashed'/>
- <enum name='VIR_DOMAIN_EVENT_ADDED' file='libvirt' value='1' type='virDomainEventType'/>
- <enum name='VIR_DOMAIN_EVENT_REMOVED' file='libvirt' value='2' type='virDomainEventType'/>
- <enum name='VIR_DOMAIN_EVENT_RESTORED' file='libvirt' value='8' type='virDomainEventType'/>
- <enum name='VIR_DOMAIN_EVENT_RESUMED' file='libvirt' value='5' type='virDomainEventType'/>
- <enum name='VIR_DOMAIN_EVENT_SAVED' file='libvirt' value='7' type='virDomainEventType'/>
- <enum name='VIR_DOMAIN_EVENT_STARTED' file='libvirt' value='3' type='virDomainEventType'/>
- <enum name='VIR_DOMAIN_EVENT_STOPPED' file='libvirt' value='6' type='virDomainEventType'/>
- <enum name='VIR_DOMAIN_EVENT_SUSPENDED' file='libvirt' value='4' type='virDomainEventType'/>
+ <enum name='VIR_DOMAIN_EVENT_ADDED' file='libvirt' value='0' type='virDomainEventType'/>
+ <enum name='VIR_DOMAIN_EVENT_REMOVED' file='libvirt' value='1' type='virDomainEventType'/>
+ <enum name='VIR_DOMAIN_EVENT_RESTORED' file='libvirt' value='7' type='virDomainEventType'/>
+ <enum name='VIR_DOMAIN_EVENT_RESUMED' file='libvirt' value='4' type='virDomainEventType'/>
+ <enum name='VIR_DOMAIN_EVENT_SAVED' file='libvirt' value='6' type='virDomainEventType'/>
+ <enum name='VIR_DOMAIN_EVENT_STARTED' file='libvirt' value='2' type='virDomainEventType'/>
+ <enum name='VIR_DOMAIN_EVENT_STOPPED' file='libvirt' value='5' type='virDomainEventType'/>
+ <enum name='VIR_DOMAIN_EVENT_SUSPENDED' file='libvirt' value='3' type='virDomainEventType'/>
<enum name='VIR_DOMAIN_NONE' file='libvirt' value='0' type='virDomainCreateFlags'/>
<enum name='VIR_DOMAIN_NOSTATE' file='libvirt' value='0' type='virDomainState' info='no state'/>
<enum name='VIR_DOMAIN_PAUSED' file='libvirt' value='3' type='virDomainState' info='the domain is paused by user'/>
// PyImport_ImportModule returns a new reference
libvirt_module = PyImport_ImportModule("libvirt");
if(!libvirt_module) {
+#if DEBUG_ERROR
printf("%s Error importing libvirt module\n", __FUNCTION__);
+#endif
PyErr_Print();
return NULL;
}
// PyModule_GetDict returns a borrowed reference
libvirt_dict = PyModule_GetDict(getLibvirtModuleObject());
if(!libvirt_dict) {
+#if DEBUG_ERROR
printf("%s Error importing libvirt dictionary\n", __FUNCTION__);
+#endif
PyErr_Print();
return NULL;
}
libvirt_dom_class = PyDict_GetItemString(getLibvirtDictObject(),
"virDomain");
if(!libvirt_dom_class) {
+#if DEBUG_ERROR
printf("%s Error importing virDomain class\n", __FUNCTION__);
+#endif
PyErr_Print();
return NULL;
}
PyObject *pyobj_ret;
PyObject *pyobj_conn_inst = (PyObject*)opaque;
- PyObject *pyobj_dom = libvirt_virDomainPtrWrap(dom);
+ PyObject *pyobj_dom;
PyObject *pyobj_dom_args;
PyObject *pyobj_dom_inst;
PyObject *dom_class;
+ int ret = -1;
+
+ LIBVIRT_ENSURE_THREAD_STATE;
/* Create a python instance of this virDomainPtr */
+ pyobj_dom = libvirt_virDomainPtrWrap(dom);
pyobj_dom_args = PyTuple_New(2);
if(PyTuple_SetItem(pyobj_dom_args, 0, pyobj_conn_inst)!=0) {
+#if DEBUG_ERROR
printf("%s error creating tuple",__FUNCTION__);
- return -1;
+#endif
+ goto cleanup;
}
if(PyTuple_SetItem(pyobj_dom_args, 1, pyobj_dom)!=0) {
+#if DEBUG_ERROR
printf("%s error creating tuple",__FUNCTION__);
- return -1;
+#endif
+ goto cleanup;
}
Py_INCREF(pyobj_conn_inst);
dom_class = getLibvirtDomainClassObject();
if(!PyClass_Check(dom_class)) {
+#if DEBUG_ERROR
printf("%s dom_class is not a class!\n", __FUNCTION__);
- return -1;
+#endif
+ goto cleanup;
}
pyobj_dom_inst = PyInstance_New(dom_class,
Py_DECREF(pyobj_dom_args);
if(!pyobj_dom_inst) {
+#if DEBUG_ERROR
printf("%s Error creating a python instance of virDomain\n", __FUNCTION__);
+#endif
PyErr_Print();
- return -1;
+ goto cleanup;
}
/* Call the Callback Dispatcher */
Py_DECREF(pyobj_dom_inst);
if(!pyobj_ret) {
+#if DEBUG_ERROR
printf("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
+#endif
PyErr_Print();
- return -1;
} else {
Py_DECREF(pyobj_ret);
- return 0;
+ ret = 0;
}
+
+cleanup:
+ LIBVIRT_RELEASE_THREAD_STATE;
+ return -1;
}
static PyObject *
if (!PyArg_ParseTuple
(args, (char *) "OO:virConnectDomainEventRegister",
&pyobj_conn, &pyobj_conn_inst)) {
+#if DEBUG_ERROR
printf("%s failed parsing tuple\n", __FUNCTION__);
+#endif
return VIR_PY_INT_FAIL;
- }
+ }
#ifdef DEBUG_ERROR
printf("libvirt_virConnectDomainEventRegister(%p %p) called\n",
Py_INCREF(pyobj_conn_inst);
+ LIBVIRT_BEGIN_ALLOW_THREADS;
+
ret = virConnectDomainEventRegister(conn,
libvirt_virConnectDomainEventCallback,
(void *)pyobj_conn_inst);
+ LIBVIRT_END_ALLOW_THREADS;
+
py_retval = libvirt_intWrap(ret);
return (py_retval);
}
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
+ LIBVIRT_BEGIN_ALLOW_THREADS;
+
ret = virConnectDomainEventDeregister(conn, libvirt_virConnectDomainEventCallback);
+ LIBVIRT_END_ALLOW_THREADS;
+
Py_DECREF(pyobj_conn_inst);
py_retval = libvirt_intWrap(ret);
return (py_retval);
PyObject *cb_args;
PyObject *pyobj_args;
+ LIBVIRT_ENSURE_THREAD_STATE;
+
/* Lookup the python callback */
python_cb = PyDict_GetItemString(getLibvirtDictObject(),
"eventInvokeHandleCallback");
if(!python_cb) {
+#if DEBUG_ERROR
printf("%s Error finding eventInvokeHandleCallback\n", __FUNCTION__);
+#endif
PyErr_Print();
- return -1;
+ goto cleanup;
}
Py_INCREF(python_cb);
Py_XDECREF(result);
Py_DECREF(pyobj_args);
+
+cleanup:
+ LIBVIRT_RELEASE_THREAD_STATE;
+
return 0;
}
libvirt_virEventUpdateHandleFunc(int fd, int event)
{
PyObject *result = NULL;
- PyObject *pyobj_args = PyTuple_New(2);
+ PyObject *pyobj_args;
+
+ LIBVIRT_ENSURE_THREAD_STATE;
+
+ pyobj_args = PyTuple_New(2);
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(fd));
PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event));
Py_XDECREF(result);
Py_DECREF(pyobj_args);
+
+ LIBVIRT_RELEASE_THREAD_STATE;
}
+
static int
libvirt_virEventRemoveHandleFunc(int fd)
{
PyObject *result = NULL;
- PyObject *pyobj_args = PyTuple_New(1);
+ PyObject *pyobj_args;
+
+ LIBVIRT_ENSURE_THREAD_STATE;
+
+ pyobj_args = PyTuple_New(1);
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(fd));
if(removeHandleObj && PyCallable_Check(removeHandleObj))
Py_XDECREF(result);
Py_DECREF(pyobj_args);
+
+ LIBVIRT_RELEASE_THREAD_STATE;
+
return 0;
}
PyObject *cb_args;
PyObject *pyobj_args;
+ LIBVIRT_ENSURE_THREAD_STATE;
+
/* Lookup the python callback */
python_cb = PyDict_GetItemString(getLibvirtDictObject(),
"eventInvokeTimeoutCallback");
if(!python_cb) {
+#if DEBUG_ERROR
printf("%s Error finding eventInvokeTimeoutCallback\n", __FUNCTION__);
+#endif
PyErr_Print();
- return -1;
+ goto cleanup;
}
Py_INCREF(python_cb);
Py_XDECREF(result);
Py_DECREF(pyobj_args);
+
+cleanup:
+ LIBVIRT_RELEASE_THREAD_STATE;
return 0;
}
libvirt_virEventUpdateTimeoutFunc(int timer, int timeout)
{
PyObject *result = NULL;
- PyObject *pyobj_args = PyTuple_New(2);
+ PyObject *pyobj_args;
+
+ LIBVIRT_ENSURE_THREAD_STATE;
+
+ pyobj_args = PyTuple_New(2);
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(timeout));
Py_XDECREF(result);
Py_DECREF(pyobj_args);
+
+ LIBVIRT_RELEASE_THREAD_STATE;
}
static int
libvirt_virEventRemoveTimeoutFunc(int timer)
{
PyObject *result = NULL;
- PyObject *pyobj_args = PyTuple_New(1);
+ PyObject *pyobj_args;
+
+ LIBVIRT_ENSURE_THREAD_STATE;
+
+ pyobj_args = PyTuple_New(1);
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
if(updateTimeoutObj && PyCallable_Check(updateTimeoutObj))
Py_XDECREF(result);
Py_DECREF(pyobj_args);
+
+ LIBVIRT_RELEASE_THREAD_STATE;
+
return 0;
}
Py_INCREF(updateTimeoutObj);
Py_INCREF(removeTimeoutObj);
+ LIBVIRT_BEGIN_ALLOW_THREADS;
+
virEventRegisterImpl(libvirt_virEventAddHandleFunc,
libvirt_virEventUpdateHandleFunc,
libvirt_virEventRemoveHandleFunc,
libvirt_virEventUpdateTimeoutFunc,
libvirt_virEventRemoveTimeoutFunc);
+ LIBVIRT_END_ALLOW_THREADS;
+
return VIR_PY_INT_SUCCESS;
}