[libvirt] [libvirt-python PATCH 16/23] change the order of some statements

Pavel Hrdina phrdina at redhat.com
Tue Sep 29 15:22:55 UTC 2015


On Sat, Sep 26, 2015 at 09:56:03AM -0400, John Ferlan wrote:
> 
> 
> On 09/24/2015 10:01 AM, Pavel Hrdina wrote:
> > This change makes it easier to free allocated object especially for
> > python objects.  We can benefit from the fact, that if you call
> > Py_DECREF on eny python object it will also remove reference for all
> 
> s/eny/any
> 
> > assigned object to the root object.  For example, calling Py_DECREF on
> > dict will also remove reference recursively on all elements in that
> > dictionary.  Our job is then just call Py_DECREF on the root element and
> > don't care about anything else.
> > 
> 
> Something else that could go in HACKING - usage of Py_[X]DECREF...

That's true, I can probably updated it during second "phase" of improving
libvirt-python.  I'm planning to improve the generator in order to automatically
generate more APIs.

> 
> > Signed-off-by: Pavel Hrdina <phrdina at redhat.com>
> > ---
> >  libvirt-override.c | 189 ++++++++++++++++++++++++-----------------------------
> >  1 file changed, 85 insertions(+), 104 deletions(-)
> > 
> > diff --git a/libvirt-override.c b/libvirt-override.c
> > index 92c31b8..63a469b 100644
> > --- a/libvirt-override.c
> > +++ b/libvirt-override.c
> > @@ -1238,9 +1238,16 @@ libvirt_virDomainGetVcpus(PyObject *self ATTRIBUTE_UNUSED,
> >          goto cleanup;
> >      if ((pycpuinfo = PyList_New(dominfo.nrVirtCpu)) == NULL)
> >          goto cleanup;
> > +
> > +    if (PyTuple_SetItem(pyretval, 0, pycpuinfo) < 0)
> > +        goto cleanup;
> > +
> >      if ((pycpumap = PyList_New(dominfo.nrVirtCpu)) == NULL)
> >          goto cleanup;
> >  
> > +    if (PyTuple_SetItem(pyretval, 1, pycpumap) < 0)
> > +        goto cleanup;
> > +
> >      for (i = 0; i < dominfo.nrVirtCpu; i++) {
> >          PyObject *info = PyTuple_New(4);
> >          PyObject *item = NULL;
> > @@ -1248,54 +1255,42 @@ libvirt_virDomainGetVcpus(PyObject *self ATTRIBUTE_UNUSED,
> >          if (info == NULL)
> >              goto cleanup;
> >  
> > +        if (PyList_SetItem(pycpuinfo, i, info) < 0)
> > +            goto cleanup;
> > +
> >          if ((item = libvirt_intWrap((long)cpuinfo[i].number)) == NULL ||
> >              PyTuple_SetItem(info, 0, item) < 0)
> > -            goto itemError;
> > +            goto cleanup;
> >  
> >          if ((item = libvirt_intWrap((long)cpuinfo[i].state)) == NULL ||
> >              PyTuple_SetItem(info, 1, item) < 0)
> > -            goto itemError;
> > +            goto cleanup;
> >  
> >          if ((item = libvirt_ulonglongWrap(cpuinfo[i].cpuTime)) == NULL ||
> >              PyTuple_SetItem(info, 2, item) < 0)
> > -            goto itemError;
> > +            goto cleanup;
> >  
> >          if ((item = libvirt_intWrap((long)cpuinfo[i].cpu)) == NULL ||
> >              PyTuple_SetItem(info, 3, item) < 0)
> > -            goto itemError;
> > -
> > -        if (PyList_SetItem(pycpuinfo, i, info) < 0)
> > -            goto itemError;
> > -
> > -        continue;
> > -     itemError:
> > -        Py_DECREF(info);
> > -        Py_XDECREF(item);
> > -        goto cleanup;
> > +            goto cleanup;
> >      }
> >      for (i = 0; i < dominfo.nrVirtCpu; i++) {
> >          PyObject *info = PyTuple_New(cpunum);
> >          size_t j;
> >          if (info == NULL)
> >              goto cleanup;
> > +
> > +        if (PyList_SetItem(pycpumap, i, info) < 0)
> > +            goto cleanup;
> > +
> >          for (j = 0; j < cpunum; j++) {
> >              PyObject *item = NULL;
> >              if ((item = PyBool_FromLong(VIR_CPU_USABLE(cpumap, cpumaplen,
> >                                                         i, j))) == NULL ||
> > -                PyTuple_SetItem(info, j, item) < 0) {
> > -                Py_DECREF(info);
> > -                Py_XDECREF(item);
> > +                PyTuple_SetItem(info, j, item) < 0)
> >                  goto cleanup;
> > -            }
> > -        }
> > -        if (PyList_SetItem(pycpumap, i, info) < 0) {
> > -            Py_DECREF(info);
> > -            goto cleanup;
> >          }
> >      }
> > -    if (PyTuple_SetItem(pyretval, 0, pycpuinfo) < 0 ||
> > -        PyTuple_SetItem(pyretval, 1, pycpumap) < 0)
> > -        goto cleanup;
> >  
> >      VIR_FREE(cpuinfo);
> >      VIR_FREE(cpumap);
> > @@ -1306,8 +1301,6 @@ libvirt_virDomainGetVcpus(PyObject *self ATTRIBUTE_UNUSED,
> >      VIR_FREE(cpuinfo);
> >      VIR_FREE(cpumap);
> >      Py_XDECREF(pyretval);
> > -    Py_XDECREF(pycpuinfo);
> > -    Py_XDECREF(pycpumap);
> >      return error;
> >  }
> 
> Splatter from bleeding eyeballs - perhaps would have been easier to read
> with incremental change ;-)
> 
> >  
> > @@ -1489,12 +1482,13 @@ libvirt_virDomainGetVcpuPinInfo(PyObject *self ATTRIBUTE_UNUSED,
> >          if (mapinfo == NULL)
> >              goto cleanup;
> >  
> > +        PyList_SetItem(pycpumaps, vcpu, mapinfo);
> > +
> >          for (pcpu = 0; pcpu < cpunum; pcpu++) {
> >              PyTuple_SetItem(mapinfo, pcpu,
> >                              PyBool_FromLong(VIR_CPU_USABLE(cpumaps, cpumaplen,
> >                                                             vcpu, pcpu)));
> >          }
> > -        PyList_SetItem(pycpumaps, vcpu, mapinfo);
> >      }
> >  
> >      VIR_FREE(cpumaps);
> > @@ -1877,12 +1871,14 @@ libvirt_virErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx,
> >          if ((list = PyTuple_New(2)) == NULL)
> >              goto cleanup;
> >  
> > +        Py_XINCREF(libvirt_virPythonErrorFuncCtxt);
> > +        PyTuple_SetItem(list, 0, libvirt_virPythonErrorFuncCtxt);
> > +
> >          if ((info = PyTuple_New(9)) == NULL)
> >              goto cleanup;
> >  
> > -        PyTuple_SetItem(list, 0, libvirt_virPythonErrorFuncCtxt);
> >          PyTuple_SetItem(list, 1, info);
> > -        Py_XINCREF(libvirt_virPythonErrorFuncCtxt);
> > +
> >          PyTuple_SetItem(info, 0, libvirt_intWrap((long) err->code));
> >          PyTuple_SetItem(info, 1, libvirt_intWrap((long) err->domain));
> >          PyTuple_SetItem(info, 2, libvirt_constcharPtrWrap(err->message));
> > @@ -1894,14 +1890,11 @@ libvirt_virErrorFuncHandler(ATTRIBUTE_UNUSED void *ctx,
> >          PyTuple_SetItem(info, 8, libvirt_intWrap((long) err->int2));
> >          /* TODO pass conn and dom if available */
> >          result = PyEval_CallObject(libvirt_virPythonErrorFuncHandler, list);
> > -        Py_XDECREF(list);
> >          Py_XDECREF(result);
> >      }
> >  
> >   cleanup:
> >      Py_XDECREF(list);
> > -    Py_XDECREF(info);
> > -
> 
> This one I'm confused by why 'info' is removed...

The 'info' is inserted to list right after it's allocation, so it's sufficient
to decref only list.

Pavel

> 
> The rest seemed OK - a couple were tough to follow, but not impossible.
> 
> John
> 
> >      LIBVIRT_RELEASE_THREAD_STATE;
> >  }
> >  

[...]




More information about the libvir-list mailing list