1
0
mirror of https://gitlab.com/libvirt/libvirt-python.git synced 2025-12-18 20:23:49 +03:00

Fix domain events python thread safety & incorrect enum generation

This commit is contained in:
Daniel P. Berrange
2008-11-17 10:26:09 +00:00
parent 034d6b3bba
commit 1782a01dd4

105
libvir.c
View File

@@ -1482,7 +1482,9 @@ getLibvirtModuleObject (void) {
// PyImport_ImportModule returns a new reference // PyImport_ImportModule returns a new reference
libvirt_module = PyImport_ImportModule("libvirt"); libvirt_module = PyImport_ImportModule("libvirt");
if(!libvirt_module) { if(!libvirt_module) {
#if DEBUG_ERROR
printf("%s Error importing libvirt module\n", __FUNCTION__); printf("%s Error importing libvirt module\n", __FUNCTION__);
#endif
PyErr_Print(); PyErr_Print();
return NULL; return NULL;
} }
@@ -1498,7 +1500,9 @@ getLibvirtDictObject (void) {
// PyModule_GetDict returns a borrowed reference // PyModule_GetDict returns a borrowed reference
libvirt_dict = PyModule_GetDict(getLibvirtModuleObject()); libvirt_dict = PyModule_GetDict(getLibvirtModuleObject());
if(!libvirt_dict) { if(!libvirt_dict) {
#if DEBUG_ERROR
printf("%s Error importing libvirt dictionary\n", __FUNCTION__); printf("%s Error importing libvirt dictionary\n", __FUNCTION__);
#endif
PyErr_Print(); PyErr_Print();
return NULL; return NULL;
} }
@@ -1516,7 +1520,9 @@ getLibvirtDomainClassObject (void) {
libvirt_dom_class = PyDict_GetItemString(getLibvirtDictObject(), libvirt_dom_class = PyDict_GetItemString(getLibvirtDictObject(),
"virDomain"); "virDomain");
if(!libvirt_dom_class) { if(!libvirt_dom_class) {
#if DEBUG_ERROR
printf("%s Error importing virDomain class\n", __FUNCTION__); printf("%s Error importing virDomain class\n", __FUNCTION__);
#endif
PyErr_Print(); PyErr_Print();
return NULL; return NULL;
} }
@@ -1537,29 +1543,39 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
PyObject *pyobj_ret; PyObject *pyobj_ret;
PyObject *pyobj_conn_inst = (PyObject*)opaque; PyObject *pyobj_conn_inst = (PyObject*)opaque;
PyObject *pyobj_dom = libvirt_virDomainPtrWrap(dom); PyObject *pyobj_dom;
PyObject *pyobj_dom_args; PyObject *pyobj_dom_args;
PyObject *pyobj_dom_inst; PyObject *pyobj_dom_inst;
PyObject *dom_class; PyObject *dom_class;
int ret = -1;
LIBVIRT_ENSURE_THREAD_STATE;
/* Create a python instance of this virDomainPtr */ /* Create a python instance of this virDomainPtr */
pyobj_dom = libvirt_virDomainPtrWrap(dom);
pyobj_dom_args = PyTuple_New(2); pyobj_dom_args = PyTuple_New(2);
if(PyTuple_SetItem(pyobj_dom_args, 0, pyobj_conn_inst)!=0) { if(PyTuple_SetItem(pyobj_dom_args, 0, pyobj_conn_inst)!=0) {
#if DEBUG_ERROR
printf("%s error creating tuple",__FUNCTION__); printf("%s error creating tuple",__FUNCTION__);
return -1; #endif
goto cleanup;
} }
if(PyTuple_SetItem(pyobj_dom_args, 1, pyobj_dom)!=0) { if(PyTuple_SetItem(pyobj_dom_args, 1, pyobj_dom)!=0) {
#if DEBUG_ERROR
printf("%s error creating tuple",__FUNCTION__); printf("%s error creating tuple",__FUNCTION__);
return -1; #endif
goto cleanup;
} }
Py_INCREF(pyobj_conn_inst); Py_INCREF(pyobj_conn_inst);
dom_class = getLibvirtDomainClassObject(); dom_class = getLibvirtDomainClassObject();
if(!PyClass_Check(dom_class)) { if(!PyClass_Check(dom_class)) {
#if DEBUG_ERROR
printf("%s dom_class is not a class!\n", __FUNCTION__); printf("%s dom_class is not a class!\n", __FUNCTION__);
return -1; #endif
goto cleanup;
} }
pyobj_dom_inst = PyInstance_New(dom_class, pyobj_dom_inst = PyInstance_New(dom_class,
@@ -1569,9 +1585,11 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
Py_DECREF(pyobj_dom_args); Py_DECREF(pyobj_dom_args);
if(!pyobj_dom_inst) { if(!pyobj_dom_inst) {
#if DEBUG_ERROR
printf("%s Error creating a python instance of virDomain\n", __FUNCTION__); printf("%s Error creating a python instance of virDomain\n", __FUNCTION__);
#endif
PyErr_Print(); PyErr_Print();
return -1; goto cleanup;
} }
/* Call the Callback Dispatcher */ /* Call the Callback Dispatcher */
@@ -1584,14 +1602,19 @@ libvirt_virConnectDomainEventCallback(virConnectPtr conn ATTRIBUTE_UNUSED,
Py_DECREF(pyobj_dom_inst); Py_DECREF(pyobj_dom_inst);
if(!pyobj_ret) { if(!pyobj_ret) {
#if DEBUG_ERROR
printf("%s - ret:%p\n", __FUNCTION__, pyobj_ret); printf("%s - ret:%p\n", __FUNCTION__, pyobj_ret);
#endif
PyErr_Print(); PyErr_Print();
return -1;
} else { } else {
Py_DECREF(pyobj_ret); Py_DECREF(pyobj_ret);
return 0; ret = 0;
} }
cleanup:
LIBVIRT_RELEASE_THREAD_STATE;
return -1;
} }
static PyObject * static PyObject *
@@ -1608,7 +1631,9 @@ libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,
if (!PyArg_ParseTuple if (!PyArg_ParseTuple
(args, (char *) "OO:virConnectDomainEventRegister", (args, (char *) "OO:virConnectDomainEventRegister",
&pyobj_conn, &pyobj_conn_inst)) { &pyobj_conn, &pyobj_conn_inst)) {
#if DEBUG_ERROR
printf("%s failed parsing tuple\n", __FUNCTION__); printf("%s failed parsing tuple\n", __FUNCTION__);
#endif
return VIR_PY_INT_FAIL; return VIR_PY_INT_FAIL;
} }
@@ -1620,10 +1645,14 @@ libvirt_virConnectDomainEventRegister(ATTRIBUTE_UNUSED PyObject * self,
Py_INCREF(pyobj_conn_inst); Py_INCREF(pyobj_conn_inst);
LIBVIRT_BEGIN_ALLOW_THREADS;
ret = virConnectDomainEventRegister(conn, ret = virConnectDomainEventRegister(conn,
libvirt_virConnectDomainEventCallback, libvirt_virConnectDomainEventCallback,
(void *)pyobj_conn_inst); (void *)pyobj_conn_inst);
LIBVIRT_END_ALLOW_THREADS;
py_retval = libvirt_intWrap(ret); py_retval = libvirt_intWrap(ret);
return (py_retval); return (py_retval);
} }
@@ -1650,8 +1679,12 @@ libvirt_virConnectDomainEventDeregister(ATTRIBUTE_UNUSED PyObject * self,
conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn); conn = (virConnectPtr) PyvirConnect_Get(pyobj_conn);
LIBVIRT_BEGIN_ALLOW_THREADS;
ret = virConnectDomainEventDeregister(conn, libvirt_virConnectDomainEventCallback); ret = virConnectDomainEventDeregister(conn, libvirt_virConnectDomainEventCallback);
LIBVIRT_END_ALLOW_THREADS;
Py_DECREF(pyobj_conn_inst); Py_DECREF(pyobj_conn_inst);
py_retval = libvirt_intWrap(ret); py_retval = libvirt_intWrap(ret);
return (py_retval); return (py_retval);
@@ -1679,13 +1712,17 @@ libvirt_virEventAddHandleFunc (int fd ATTRIBUTE_UNUSED, int event ATTRIBUTE_UNU
PyObject *cb_args; PyObject *cb_args;
PyObject *pyobj_args; PyObject *pyobj_args;
LIBVIRT_ENSURE_THREAD_STATE;
/* Lookup the python callback */ /* Lookup the python callback */
python_cb = PyDict_GetItemString(getLibvirtDictObject(), python_cb = PyDict_GetItemString(getLibvirtDictObject(),
"eventInvokeHandleCallback"); "eventInvokeHandleCallback");
if(!python_cb) { if(!python_cb) {
#if DEBUG_ERROR
printf("%s Error finding eventInvokeHandleCallback\n", __FUNCTION__); printf("%s Error finding eventInvokeHandleCallback\n", __FUNCTION__);
#endif
PyErr_Print(); PyErr_Print();
return -1; goto cleanup;
} }
Py_INCREF(python_cb); Py_INCREF(python_cb);
@@ -1708,6 +1745,10 @@ libvirt_virEventAddHandleFunc (int fd ATTRIBUTE_UNUSED, int event ATTRIBUTE_UNU
Py_XDECREF(result); Py_XDECREF(result);
Py_DECREF(pyobj_args); Py_DECREF(pyobj_args);
cleanup:
LIBVIRT_RELEASE_THREAD_STATE;
return 0; return 0;
} }
@@ -1715,7 +1756,11 @@ static void
libvirt_virEventUpdateHandleFunc(int fd, int event) libvirt_virEventUpdateHandleFunc(int fd, int event)
{ {
PyObject *result = NULL; 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, 0, libvirt_intWrap(fd));
PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event)); PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(event));
@@ -1724,13 +1769,20 @@ libvirt_virEventUpdateHandleFunc(int fd, int event)
Py_XDECREF(result); Py_XDECREF(result);
Py_DECREF(pyobj_args); Py_DECREF(pyobj_args);
LIBVIRT_RELEASE_THREAD_STATE;
} }
static int static int
libvirt_virEventRemoveHandleFunc(int fd) libvirt_virEventRemoveHandleFunc(int fd)
{ {
PyObject *result = NULL; 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)); PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(fd));
if(removeHandleObj && PyCallable_Check(removeHandleObj)) if(removeHandleObj && PyCallable_Check(removeHandleObj))
@@ -1738,6 +1790,9 @@ libvirt_virEventRemoveHandleFunc(int fd)
Py_XDECREF(result); Py_XDECREF(result);
Py_DECREF(pyobj_args); Py_DECREF(pyobj_args);
LIBVIRT_RELEASE_THREAD_STATE;
return 0; return 0;
} }
@@ -1754,13 +1809,17 @@ libvirt_virEventAddTimeoutFunc(int timeout, virEventTimeoutCallback cb,
PyObject *cb_args; PyObject *cb_args;
PyObject *pyobj_args; PyObject *pyobj_args;
LIBVIRT_ENSURE_THREAD_STATE;
/* Lookup the python callback */ /* Lookup the python callback */
python_cb = PyDict_GetItemString(getLibvirtDictObject(), python_cb = PyDict_GetItemString(getLibvirtDictObject(),
"eventInvokeTimeoutCallback"); "eventInvokeTimeoutCallback");
if(!python_cb) { if(!python_cb) {
#if DEBUG_ERROR
printf("%s Error finding eventInvokeTimeoutCallback\n", __FUNCTION__); printf("%s Error finding eventInvokeTimeoutCallback\n", __FUNCTION__);
#endif
PyErr_Print(); PyErr_Print();
return -1; goto cleanup;
} }
Py_INCREF(python_cb); Py_INCREF(python_cb);
@@ -1783,6 +1842,9 @@ libvirt_virEventAddTimeoutFunc(int timeout, virEventTimeoutCallback cb,
Py_XDECREF(result); Py_XDECREF(result);
Py_DECREF(pyobj_args); Py_DECREF(pyobj_args);
cleanup:
LIBVIRT_RELEASE_THREAD_STATE;
return 0; return 0;
} }
@@ -1790,7 +1852,11 @@ static void
libvirt_virEventUpdateTimeoutFunc(int timer, int timeout) libvirt_virEventUpdateTimeoutFunc(int timer, int timeout)
{ {
PyObject *result = NULL; 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, 0, libvirt_intWrap(timer));
PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(timeout)); PyTuple_SetItem(pyobj_args, 1, libvirt_intWrap(timeout));
@@ -1799,13 +1865,19 @@ libvirt_virEventUpdateTimeoutFunc(int timer, int timeout)
Py_XDECREF(result); Py_XDECREF(result);
Py_DECREF(pyobj_args); Py_DECREF(pyobj_args);
LIBVIRT_RELEASE_THREAD_STATE;
} }
static int static int
libvirt_virEventRemoveTimeoutFunc(int timer) libvirt_virEventRemoveTimeoutFunc(int timer)
{ {
PyObject *result = NULL; 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)); PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(timer));
if(updateTimeoutObj && PyCallable_Check(updateTimeoutObj)) if(updateTimeoutObj && PyCallable_Check(updateTimeoutObj))
@@ -1813,6 +1885,9 @@ libvirt_virEventRemoveTimeoutFunc(int timer)
Py_XDECREF(result); Py_XDECREF(result);
Py_DECREF(pyobj_args); Py_DECREF(pyobj_args);
LIBVIRT_RELEASE_THREAD_STATE;
return 0; return 0;
} }
@@ -1845,6 +1920,8 @@ libvirt_virEventRegisterImpl(ATTRIBUTE_UNUSED PyObject * self,
Py_INCREF(updateTimeoutObj); Py_INCREF(updateTimeoutObj);
Py_INCREF(removeTimeoutObj); Py_INCREF(removeTimeoutObj);
LIBVIRT_BEGIN_ALLOW_THREADS;
virEventRegisterImpl(libvirt_virEventAddHandleFunc, virEventRegisterImpl(libvirt_virEventAddHandleFunc,
libvirt_virEventUpdateHandleFunc, libvirt_virEventUpdateHandleFunc,
libvirt_virEventRemoveHandleFunc, libvirt_virEventRemoveHandleFunc,
@@ -1852,6 +1929,8 @@ libvirt_virEventRegisterImpl(ATTRIBUTE_UNUSED PyObject * self,
libvirt_virEventUpdateTimeoutFunc, libvirt_virEventUpdateTimeoutFunc,
libvirt_virEventRemoveTimeoutFunc); libvirt_virEventRemoveTimeoutFunc);
LIBVIRT_END_ALLOW_THREADS;
return VIR_PY_INT_SUCCESS; return VIR_PY_INT_SUCCESS;
} }