[libvirt] [PATCH V6 1/3] Add a class for file descriptor sets

Eric Blake eblake at redhat.com
Fri Feb 15 21:49:47 UTC 2013


On 02/14/2013 05:00 AM, Stefan Berger wrote:
> Rather than passing the next-to-use file descriptor set Id
> and the hash table for rembering the mappings of aliases to
> file descriptor sets around, encapsulate the two in a class.
> 
> Signed-off-by: Stefan Berger <stefanb at linux.vnet.ibm.com>
> 
> ---

In addition to Corey's review,

> 
> Index: libvirt/src/util/virfdset.c
> ===================================================================

> +
> +void virFdSetFree(virFdSetPtr fdset)
> +{
> +    virObjectUnref(fdset);
> +}

This function is not necessary; callers can directly use virObjectUnref().

> +
> +int virFdSetNextSet(virFdSetPtr fdset, const char *alias,
> +                    unsigned int *fdsetnum)
> +{
> +    int *num;
> +
> +    if (VIR_ALLOC(num) < 0) {
> +        virReportOOMError();
> +        return -1;
> +    }

Is it necessary to allocate an integer?  Rather, I would just:

> +
> +    *num = fdset->nextfdset;
> +
> +    if (virHashAddEntry(fdset->aliasToFdSet, alias, num) < 0) {

virHashAddEntry(fdset->aliasToFdSet, alias, (void*)fdset->nextfdset);

> +        VIR_FREE(num);
> +        return -1;
> +    }
> +
> +    *fdsetnum = fdset->nextfdset++;

That would also avoid the need for a hash cleanup function.

> +static void virFdSetPrintAliasToFdSet(void *payload,
> +                                      const void *name,
> +                                      void *data)
> +{
> +    virBufferPtr buf = data;
> +
> +    virBufferAsprintf(buf, "  <entry alias='%s' fdset='%u'/>\n",
> +                      (char *)name,
> +                      *(unsigned int *)payload);

Minor type mismatch - the hash stores ints but here you are printing
unsigned ints (won't matter in practice).

Then again, if you store 'int' instead of 'int*' in the hashtable, this
would just be '(int)payload' instead of '*(unsigned int*)payload'.

> +}
> +
> +void virFdSetFormatXML(virFdSetPtr fdset, virBufferPtr buf)
> +{
> +    virBufferAsprintf(buf, "<fdsets>\n");
> +    virHashForEach(fdset->aliasToFdSet, virFdSetPrintAliasToFdSet, buf);
> +    virBufferAsprintf(buf, "</fdsets>\n");
> +}
> +
> +int virFdSetParseXML(virFdSetPtr fdset, const char *xPath,
> +                     xmlXPathContextPtr ctxt)
> +{
> +    xmlNodePtr *nodes = NULL;
> +    int n, i;
> +    char *key = NULL;
> +    char *val = NULL;
> +    unsigned int *fdsetnum = NULL;
> +    int ret = 0;
> +
> +    virFdSetReset(fdset);

Is anyone outside of this file ever going to call virFdSetReset, or can
you mark it static?

> +
> +    if ((n = virXPathNodeSet(xPath, ctxt, &nodes)) < 0) {
> +        virReportError(VIR_ERR_INTERNAL_ERROR,
> +                       "%s", _("failed to parse qemu file descriptor sets"));
> +        goto error;
> +    }
> +    if (n > 0) {
> +        for (i = 0 ; i < n ; i++) {
> +            key = virXMLPropString(nodes[i], "alias");
> +            val = virXMLPropString(nodes[i], "fdset");
> +            if (key && val) {
> +                if (VIR_ALLOC(fdsetnum) < 0) {
> +                    virReportOOMError();
> +                    ret = -1;
> +                    goto error;

Again, if you just store the int directly (since int is smaller than
void*), this avoids wasteful allocations of an int*.


> +++ libvirt/src/util/virfdset.h

> +
> +/**
> + * virFdSetNew
> + *
> + * Create a new FdSet,
> + * Returns pointer to new FdSet on success, NULL if no memory was available.
> + */
> +virFdSetPtr virFdSetNew(void) ATTRIBUTE_RETURN_CHECK;
> +
> +/**
> + * virFdSetFree
> + * @fdset : the FdSet to free

No space before the colon.

> Index: libvirt/src/libvirt_private.syms
> ===================================================================
> --- libvirt.orig/src/libvirt_private.syms
> +++ libvirt/src/libvirt_private.syms
> @@ -650,6 +650,16 @@ virFDStreamOpen;
>  virFDStreamOpenFile;
>  
>  
> +# virfdset.h
> +virFdSetFormatXML;
> +virFdSetFree;
> +virFdSetNew;
> +virFdSetNextSet;
> +virFdSetParseXML;
> +virFdSetRemoveAlias;
> +virFdSetReset;
> +
> +
>  # hash.h
>  virHashAddEntry;
>  virHashCreate;

Hmm, this file is a bit out of order; it's easier to find exports if we
were to sort sections by file name.  I'll submit that patch independently.

Overall looks pretty nice - I'm glad Dan provided a better design than
what I had been thinking of.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 621 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20130215/585f25de/attachment-0001.sig>


More information about the libvir-list mailing list