On 01/06/2012 04:36 PM, Osier Yang wrote:
On
2011年12月30日 14:57, ajia@redhat.com wrote:
From: Alex Jia<ajia@redhat.com>
The parameter 'device_weight' is a string, however, the
'VIR_TYPED_PARAM_STRING'
type condition is missed by libvirt_virDomain{Set,
Get}BlkioParameters bindings,
the result is we can't get or change 'device_weight' value.
* python/libvirt-override.c: Add missing
'VIR_TYPED_PARAM_STRING' condition into
libvirt_virDomain{Set, Get}BlkioParameters bindings and free
allocated memory.
https://bugzilla.redhat.com/show_bug.cgi?id=770795
Signed-off-by: Alex Jia<ajia@redhat.com>
---
python/libvirt-override.c | 20 ++++++++++++++++++++
1 files changed, 20 insertions(+), 0 deletions(-)
diff --git a/python/libvirt-override.c
b/python/libvirt-override.c
index d2aad0f..38a35b8 100644
--- a/python/libvirt-override.c
+++ b/python/libvirt-override.c
@@ -726,6 +726,10 @@
libvirt_virDomainSetBlkioParameters(PyObject *self
ATTRIBUTE_UNUSED,
}
break;
+ case VIR_TYPED_PARAM_STRING:
+ params[i].value.s = PyString_AsString(val);
+ break;
+
default:
free(params);
return VIR_PY_INT_FAIL;
@@ -735,6 +739,11 @@
libvirt_virDomainSetBlkioParameters(PyObject *self
ATTRIBUTE_UNUSED,
LIBVIRT_BEGIN_ALLOW_THREADS;
i_retval = virDomainSetBlkioParameters(domain, params,
nparams, flags);
LIBVIRT_END_ALLOW_THREADS;
+
+ for(i=0; i< nparams; i++)
+ if (params[i].type == VIR_TYPED_PARAM_STRING)
+ free(params[i].value.s);
IMHO this is not right, anything returned by PyString_AsString
should
*not* be deallocated. It doesn't returns a copy but a pointer
reference.
Note that Python still wants to see "params[i].value.s", and I
guess
Python will be responsiable to do the cleanup. But I'm not quite
convinced about that, not formiliar with Python's memory
management.
Yeah, I know python.org says "PyString_AsString() must not be
deallocated, because its
pointer
refers to the internal buffer of string, not a copy." in
here, I want o free the contents
of string, may be free(val) is more clear.
+
if (i_retval< 0) {
free(params);
return VIR_PY_INT_FAIL;
@@ -811,6 +820,10 @@
libvirt_virDomainGetBlkioParameters(PyObject *self
ATTRIBUTE_UNUSED,
val = PyBool_FromLong((long)params[i].value.b);
break;
+ case VIR_TYPED_PARAM_STRING:
+ val = PyString_FromString((char
*)params[i].value.s);
+ break;
+
default:
free(params);
Py_DECREF(info);
@@ -819,7 +832,14 @@
libvirt_virDomainGetBlkioParameters(PyObject *self
ATTRIBUTE_UNUSED,
key = libvirt_constcharPtrWrap(params[i].field);
PyDict_SetItem(info, key, val);
+ Py_DECREF(key);
+ Py_DECREF(val);
Why it needs to descrease the reference count of "key" and "val"?
PyDict_SetItem() puts something in a dictionary is "storing" it,
therefore PyDict_SetItem() INCREFs both the key and the value.
}
+
+ for(i=0; i< nparams; i++)
+ if (params[i].type == VIR_TYPED_PARAM_STRING)
+ free(params[i].value.s);
+
params[i].value.s also needs to be free()'ed in default branch,
before
the function returns.
I don't think so, if 'default' branch is hit, it means
"params[i].type != VIR_TYPED_PARAM_STRING", in other words, codes
haven't called 'PyString_FromString()' method, hence we don't need
to free memory, please correct me if I'm wrong :)
Thanks for your comments again,
Alex
free(params);
return(info);
}