[libvirt] [PATCH V6 1/3] Add a class for file descriptor sets
Corey Bryant
coreyb at linux.vnet.ibm.com
Fri Feb 15 20:46:20 UTC 2013
On 02/14/2013 07: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
Remembering is missing an e
> file descriptor sets around, encapsulate the two in a class.
>
> Signed-off-by: Stefan Berger<stefanb at linux.vnet.ibm.com>
>
> ---
> v5->v6:
> - following to changeset 2e5d7798df
>
> v4->v5:
> - followed Daniel Berrange's comments
> - converted to virObject
> - provide virFdSetNew
>
> ---
> src/Makefile.am | 1
> src/libvirt_private.syms | 10 ++
> src/util/virfdset.c | 205 +++++++++++++++++++++++++++++++++++++++++++++++
> src/util/virfdset.h | 112 +++++++++++++++++++++++++
> 4 files changed, 328 insertions(+)
>
> Index: libvirt/src/util/virfdset.c
> ===================================================================
> --- /dev/null
> +++ libvirt/src/util/virfdset.c
> @@ -0,0 +1,205 @@
> +/*
> + * virfdset.c: File descriptor set support
> + *
> + * Copyright (C) 2013 IBM Corporation
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library. If not, see
> + *<http://www.gnu.org/licenses/>.
> + *
> + * Author: Stefan Berger<stefanb at linux.vnet.ibm.com>
> + */
> +
> +#include <config.h>
> +
> +#include "virfdset.h"
> +#include "virobject.h"
> +#include "viralloc.h"
> +#include "virutil.h"
> +#include "virerror.h"
> +#include "virbuffer.h"
> +
> +#define VIR_FROM_THIS VIR_FROM_NONE
> +
> +
> +struct _virFdSet {
> + virObject object;
> + virHashTablePtr aliasToFdSet;
> + unsigned int nextfdset;
> +};
> +
> +static virClassPtr virFdSetClass;
> +static void virFdSetDispose(void *obj);
> +
> +static int virFdSetOnceInit(void)
> +{
> + if (!(virFdSetClass = virClassNew(virClassForObject(),
> + "virFdSet",
> + sizeof(virFdSet),
> + virFdSetDispose)))
> + return -1;
> +
> + return 0;
> +}
> +
> +VIR_ONCE_GLOBAL_INIT(virFdSet)
> +
> +static void virFdSetDispose(void *obj)
> +{
> + virFdSetPtr fdset = obj;
> +
> + virHashFree(fdset->aliasToFdSet);
> +}
> +
> +static void virFdSetFreeIntPtr(void *payload,
> + const void *name ATTRIBUTE_UNUSED)
> +{
> + VIR_FREE(payload);
> +}
> +
> +virFdSetPtr virFdSetNew(void)
> +{
> + virFdSetPtr fdset;
> +
> + if (virFdSetInitialize() < 0)
> + return NULL;
> +
> + if (!(fdset = virObjectNew(virFdSetClass)))
> + return NULL;
> +
> + if (!(fdset->aliasToFdSet = virHashCreate(10, virFdSetFreeIntPtr))) {
> + virObjectUnref(fdset);
> + return NULL;
> + }
> + fdset->nextfdset = 1;
> +
> + return fdset;
> +}
> +
> +void virFdSetFree(virFdSetPtr fdset)
> +{
> + virObjectUnref(fdset);
> +}
> +
> +void virFdSetReset(virFdSetPtr fdset)
> +{
> + virHashRemoveAll(fdset->aliasToFdSet);
> + fdset->nextfdset = 1;
> +}
> +
> +void virFdSetRemoveAlias(virFdSetPtr fdset, const char *alias)
> +{
> + virHashRemoveEntry(fdset->aliasToFdSet, alias);
> +}
> +
> +int virFdSetNextSet(virFdSetPtr fdset, const char *alias,
> + unsigned int *fdsetnum)
> +{
> + int *num;
> +
> + if (VIR_ALLOC(num) < 0) {
> + virReportOOMError();
> + return -1;
> + }
> +
> + *num = fdset->nextfdset;
> +
> + if (virHashAddEntry(fdset->aliasToFdSet, alias, num) < 0) {
> + VIR_FREE(num);
> + return -1;
> + }
> +
> + *fdsetnum = fdset->nextfdset++;
> +
> + return 0;
> +}
> +
> +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);
> +}
> +
> +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);
> +
> + 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;
> + }
> + if (virStrToLong_ui(val, NULL, 10, fdsetnum) < 0) {
> + virReportError(VIR_ERR_INTERNAL_ERROR,
> + _("incorrect fdset '%s', expected positive"
> + "integer"), val);
> + VIR_FREE(fdsetnum);
> + ret = -1;
> + goto error;
> + }
> +
> + if (fdset->nextfdset <= *fdsetnum)
> + fdset->nextfdset = *fdsetnum + 1;
> +
> + if (virHashAddEntry(fdset->aliasToFdSet, key, fdsetnum) < 0) {
> + virReportOOMError();
> + VIR_FREE(fdset);
> + ret = -1;
> + goto error;
> + }
> + }
> + VIR_FREE(key);
> + VIR_FREE(val);
> + }
> + }
> +
> +error:
> + if (ret < 0)
> + virFdSetReset(fdset);
> +
> + VIR_FREE(nodes);
> + VIR_FREE(key);
> + VIR_FREE(val);
> +
> + return ret;
> +}
> Index: libvirt/src/util/virfdset.h
> ===================================================================
> --- /dev/null
> +++ libvirt/src/util/virfdset.h
> @@ -0,0 +1,112 @@
> +/*
> + * virfdset.h: File descriptor set support
> + *
> + * Copyright (C) 2013 IBM Corporation
> + *
> + * This library is free software; you can redistribute it and/or
> + * modify it under the terms of the GNU Lesser General Public
> + * License as published by the Free Software Foundation; either
> + * version 2.1 of the License, or (at your option) any later version.
> + *
> + * This library is distributed in the hope that it will be useful,
> + * but WITHOUT ANY WARRANTY; without even the implied warranty of
> + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
> + * Lesser General Public License for more details.
> + *
> + * You should have received a copy of the GNU Lesser General Public
> + * License along with this library. If not, see
> + *<http://www.gnu.org/licenses/>.
> + *
> + * Author: Stefan Berger<stefanb at linux.vnet.ibm.com>
> + */
> +#ifndef __FDSET_H__
> +# define __FDSET_H__
> +
> +# include "internal.h"
> +# include "virbuffer.h"
> +# include "virxml.h"
> +# include "virhash.h"
> +
> +typedef struct _virFdSet virFdSet;
> +typedef virFdSet *virFdSetPtr;
> +
> +
> +/**
> + * 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
> + *
> + * Free the FdSet
> + */
> +void virFdSetFree(virFdSetPtr fdset);
> +
> +/**
> + * virFdSetReset
> + * @fdset: fdset
> + *
> + * Reset the @fdset and forget about all mappings
> + * of aliases to file descriptor set data
> + */
> +void virFdSetReset(virFdSetPtr fdset)
> + ATTRIBUTE_NONNULL(1);
> +
> +/**
> + * virFdSetRemoveAlias
> + * @fdset: the fdset
> + * @alias: the alias to remove
> + *
> + * Remove the given alias' mapping from @fdset
> + */
> +void virFdSetRemoveAlias(virFdSetPtr fdset, const char *alias)
> + ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
> +
> +
> +/**
> + * virFdSetNextSet
> + * @fdset: fdset
> + * @alias: device alias
> + * @fdset: pointer to unsigned int for storing the file descriptor set id
This should be @fdsetnum
--
Regards,
Corey Bryant
More information about the libvir-list
mailing list