Signed-off-by: Pavel Hrdina <phrdina@xxxxxxxxxx> --- libvirt-utils.h | 82 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/libvirt-utils.h b/libvirt-utils.h index 9f80133..f74654c 100644 --- a/libvirt-utils.h +++ b/libvirt-utils.h @@ -155,6 +155,88 @@ void virFree(void *ptrptr) ATTRIBUTE_NONNULL(1); /** + * VIR_PY_TUPLE_SET_GOTO: + * @TUPLE: a pointer to a tuple object + * @INDEX: a position in the tuple object + * @VALUE: a pointer to a python object to add into the tuple + * @GOTO: a label to jump to in case of error + * + * Add the new value to specific place into the python tuple object. In case of + * error it will jump to provided label and DECREF the value to not leak memory. + */ +#define VIR_PY_TUPLE_SET_GOTO(TUPLE, INDEX, VALUE, GOTO) \ + do { \ + PyObject *tmpVal = VALUE; \ + if (!tmpVal || PyTuple_SetItem(TUPLE, INDEX, tmpVal) < 0) \ + goto GOTO; \ + } while (0) + + +/** + * VIR_PY_LIST_SET_GOTO: + * @LIST: a pointer to a list object + * @INDEX: a position in the list object + * @VALUE: a pointer to a python object to add into the list + * @GOTO: a label to jump to in case of error + * + * Add the new value to specific place into the python list object. In case of + * error it will jump to provided label and DECREF the value to not leak memory. + */ +#define VIR_PY_LIST_SET_GOTO(LIST, INDEX, VALUE, GOTO) \ + do { \ + PyObject *tmpVal = VALUE; \ + if (!tmpVal || PyList_SetItem(LIST, INDEX, tmpVal) < 0) \ + goto GOTO; \ + } while (0) + + +/** + * VIR_PY_LIST_APPEND_GOTO: + * @LIST: a pointer to a python list object + * @VALUE: a pointer to a python object to add into the list + * @GOTO: a label to jump to in case of error + * + * Append the new value into the end of the python list object. In case of + * error it will jump to provided label and DECREF the value to not leak memory. + */ +#define VIR_PY_LIST_APPEND_GOTO(LIST, VALUE, GOTO) \ + do { \ + PyObject *tmpVal = VALUE; \ + if (!tmpVal || PyList_Append(LIST, tmpVal) < 0) { \ + Py_XDECREF(tmpVal); \ + goto GOTO; \ + } \ + Py_DECREF(tmpVal); \ + } while (0) + + +/** + * VIR_PY_DICT_SET_GOTO: + * @DICT: a pointer to a python dict object + * @KEY: a pointer to a python string object which will be used as a key + * @VALUE: a pointer to a python object to add into the dict under provided key + * @GOTO: a label to jump to in case of error + * + * Add a new pair of key:value into the python dict object. In case of error it + * will jump to provided label. It will DECREF both key and value in case of + * success or error. + */ +#define VIR_PY_DICT_SET_GOTO(DICT, KEY, VALUE, GOTO) \ + do { \ + PyObject *tmpKey = KEY; \ + PyObject *tmpVal = VALUE; \ + if (!tmpKey || !tmpVal || \ + PyDict_SetItem(DICT, tmpKey, tmpVal) < 0) { \ + Py_XDECREF(tmpKey); \ + Py_XDECREF(tmpVal); \ + goto GOTO; \ + } \ + Py_DECREF(tmpKey); \ + Py_DECREF(tmpVal); \ + } while (0) + + +/** * VIR_ALLOC: * @ptr: pointer to hold address of allocated memory * -- 2.5.3 -- libvir-list mailing list libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list