summaryrefslogtreecommitdiffstats
path: root/libvirt-override.c
diff options
context:
space:
mode:
authorPeter Krempa <pkrempa@redhat.com>2013-03-20 11:43:41 +0100
committerPeter Krempa <pkrempa@redhat.com>2013-03-21 12:32:03 +0100
commita5036ccfd634186c57202c7f49c4eb6703911220 (patch)
treeb85f01fe969c7e57a16daab6f7013366f68e6a6b /libvirt-override.c
parent48c23ca1f14b8cfe6ab52138f9ba5835198288be (diff)
downloadlibvirt-python-split-a5036ccfd634186c57202c7f49c4eb6703911220.tar.gz
libvirt-python-split-a5036ccfd634186c57202c7f49c4eb6703911220.tar.xz
libvirt-python-split-a5036ccfd634186c57202c7f49c4eb6703911220.zip
python: Fix emulatorpin API bindings
The addition of emulator pinning APIs didn't think of doing the right job with python APIs for them. The default generator produced unusable code for this. This patch switches to proper code as in the case of domain Vcpu pining. This change can be classified as a python API-breaker but in the state the code was before I doubt anyone was able to use it successfully.
Diffstat (limited to 'libvirt-override.c')
-rw-r--r--libvirt-override.c118
1 files changed, 118 insertions, 0 deletions
diff --git a/libvirt-override.c b/libvirt-override.c
index 9637598..f6573e1 100644
--- a/libvirt-override.c
+++ b/libvirt-override.c
@@ -1664,6 +1664,122 @@ cleanup:
return VIR_PY_NONE;
}
+
+static PyObject *
+libvirt_virDomainPinEmulator(PyObject *self ATTRIBUTE_UNUSED,
+ PyObject *args)
+{
+ virDomainPtr domain;
+ PyObject *pyobj_domain, *pycpumap;
+ unsigned char *cpumap = NULL;
+ int cpumaplen, i, tuple_size, cpunum;
+ int i_retval;
+ unsigned int flags;
+
+ if (!PyArg_ParseTuple(args, (char *)"OOi:virDomainPinVcpu",
+ &pyobj_domain, &pycpumap, &flags))
+ return NULL;
+
+ domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
+
+ if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
+ return VIR_PY_INT_FAIL;
+
+ cpumaplen = VIR_CPU_MAPLEN(cpunum);
+
+ if (!PyTuple_Check(pycpumap)) {
+ PyErr_SetString(PyExc_TypeError, "Unexpected type, tuple is required");
+ return NULL;
+ }
+
+ if ((tuple_size = PyTuple_Size(pycpumap)) == -1)
+ return NULL;
+
+ if (VIR_ALLOC_N(cpumap, cpumaplen) < 0)
+ return PyErr_NoMemory();
+
+ for (i = 0; i < tuple_size; i++) {
+ PyObject *flag = PyTuple_GetItem(pycpumap, i);
+ bool b;
+
+ if (!flag || libvirt_boolUnwrap(flag, &b) < 0) {
+ VIR_FREE(cpumap);
+ return VIR_PY_INT_FAIL;
+ }
+
+ if (b)
+ VIR_USE_CPU(cpumap, i);
+ else
+ VIR_UNUSE_CPU(cpumap, i);
+ }
+
+ for (; i < cpunum; i++)
+ VIR_UNUSE_CPU(cpumap, i);
+
+ LIBVIRT_BEGIN_ALLOW_THREADS;
+ i_retval = virDomainPinEmulator(domain, cpumap, cpumaplen, flags);
+ LIBVIRT_END_ALLOW_THREADS;
+
+ VIR_FREE(cpumap);
+
+ if (i_retval < 0)
+ return VIR_PY_INT_FAIL;
+
+ return VIR_PY_INT_SUCCESS;
+}
+
+
+static PyObject *
+libvirt_virDomainGetEmulatorPinInfo(PyObject *self ATTRIBUTE_UNUSED,
+ PyObject *args)
+{
+ virDomainPtr domain;
+ PyObject *pyobj_domain;
+ PyObject *pycpumap;
+ unsigned char *cpumap;
+ size_t cpumaplen;
+ size_t pcpu;
+ unsigned int flags;
+ int ret;
+ int cpunum;
+
+ if (!PyArg_ParseTuple(args, (char *)"Oi:virDomainEmulatorPinInfo",
+ &pyobj_domain, &flags))
+ return NULL;
+
+ domain = (virDomainPtr) PyvirDomain_Get(pyobj_domain);
+
+ if ((cpunum = getPyNodeCPUCount(virDomainGetConnect(domain))) < 0)
+ return VIR_PY_NONE;
+
+ cpumaplen = VIR_CPU_MAPLEN(cpunum);
+
+ if (VIR_ALLOC_N(cpumap, cpumaplen) < 0)
+ return PyErr_NoMemory();
+
+ LIBVIRT_BEGIN_ALLOW_THREADS;
+ ret = virDomainGetEmulatorPinInfo(domain, cpumap, cpumaplen, flags);
+ LIBVIRT_END_ALLOW_THREADS;
+ if (ret < 0) {
+ VIR_FREE(cpumap);
+ return VIR_PY_NONE;
+ }
+
+ if (!(pycpumap = PyTuple_New(cpunum))) {
+ VIR_FREE(cpumap);
+ return NULL;
+ }
+
+ for (pcpu = 0; pcpu < cpunum; pcpu++)
+ PyTuple_SET_ITEM(pycpumap, pcpu,
+ PyBool_FromLong(VIR_CPU_USABLE(cpumap, cpumaplen,
+ 0, pcpu)));
+
+ VIR_FREE(cpumap);
+ return pycpumap;
+}
+
+
/************************************************************************
* *
* Global error handler at the Python level *
@@ -6705,6 +6821,8 @@ static PyMethodDef libvirtMethods[] = {
{(char *) "virDomainPinVcpu", libvirt_virDomainPinVcpu, METH_VARARGS, NULL},
{(char *) "virDomainPinVcpuFlags", libvirt_virDomainPinVcpuFlags, METH_VARARGS, NULL},
{(char *) "virDomainGetVcpuPinInfo", libvirt_virDomainGetVcpuPinInfo, METH_VARARGS, NULL},
+ {(char *) "virDomainGetEmulatorPinInfo", libvirt_virDomainGetEmulatorPinInfo, METH_VARARGS, NULL},
+ {(char *) "virDomainPinEmulator", libvirt_virDomainPinEmulator, METH_VARARGS, NULL},
{(char *) "virConnectListStoragePools", libvirt_virConnectListStoragePools, METH_VARARGS, NULL},
{(char *) "virConnectListDefinedStoragePools", libvirt_virConnectListDefinedStoragePools, METH_VARARGS, NULL},
{(char *) "virConnectListAllStoragePools", libvirt_virConnectListAllStoragePools, METH_VARARGS, NULL},