[libvirt] [PATCH v4 3/4] nwfilter: Convert _virNWFilterObjList to use virObjectRWLockable

Stefan Berger stefanb at linux.vnet.ibm.com
Fri Feb 2 21:57:58 UTC 2018


On 02/02/2018 02:33 PM, John Ferlan wrote:
>
> On 01/31/2018 10:10 PM, Stefan Berger wrote:
>> On 12/08/2017 09:01 AM, John Ferlan wrote:
>>> Implement the self locking object list for nwfilter object lists
>>> that uses two hash tables to store the nwfilter object by UUID or
>>> by Name.
>>>
>>> As part of this alter the uuid argument to virNWFilterObjLookupByUUID
>>> to expect an already formatted uuidstr.
>>>
>>> Alter the existing list traversal code to implement the hash table
>>> find/lookup/search functionality.
>>>
>>> Signed-off-by: John Ferlan <jferlan at redhat.com>
>>> ---
>>>    src/conf/virnwfilterobj.c      | 402
>>> ++++++++++++++++++++++++++++-------------
>>>    src/conf/virnwfilterobj.h      |   2 +-
>>>    src/nwfilter/nwfilter_driver.c |   5 +-
>>>    3 files changed, 282 insertions(+), 127 deletions(-)
>>>
>>> diff --git a/src/conf/virnwfilterobj.c b/src/conf/virnwfilterobj.c
>>> index 6b4758656..a4e6a03d2 100644
>>> --- a/src/conf/virnwfilterobj.c
>>> +++ b/src/conf/virnwfilterobj.c
>>> @@ -43,12 +43,21 @@ struct _virNWFilterObj {
>>>    };
>>>
>>>    struct _virNWFilterObjList {
>>> -    size_t count;
>>> -    virNWFilterObjPtr *objs;
>>> +    virObjectRWLockable parent;
>>> +
>>> +    /* uuid string -> virNWFilterObj  mapping
>>> +     * for O(1), lockless lookup-by-uuid */
>>> +    virHashTable *objs;
>>> +
>>> +    /* name -> virNWFilterObj mapping for O(1),
>>> +     * lockless lookup-by-name */
>>> +    virHashTable *objsName;
>>>    };
>>>
>>>    static virClassPtr virNWFilterObjClass;
>>> +static virClassPtr virNWFilterObjListClass;
>>>    static void virNWFilterObjDispose(void *opaque);
>>> +static void virNWFilterObjListDispose(void *opaque);
>>>
>>>
>>>    static int
>>> @@ -60,6 +69,12 @@ virNWFilterObjOnceInit(void)
>>>                                                virNWFilterObjDispose)))
>>>            return -1;
>>>
>>> +    if (!(virNWFilterObjListClass =
>>> virClassNew(virClassForObjectRWLockable(),
>>> +                                                "virNWFilterObjList",
>>> +
>>> sizeof(virNWFilterObjList),
>>> +
>>> virNWFilterObjListDispose)))
>>> +        return -1;
>>> +
>>>        return 0;
>>>    }
>>>
>>> @@ -144,14 +159,20 @@ virNWFilterObjDispose(void *opaque)
>>>    }
>>>
>>>
>>> +static void
>>> +virNWFilterObjListDispose(void *opaque)
>>> +{
>>> +    virNWFilterObjListPtr nwfilters = opaque;
>>> +
>>> +    virHashFree(nwfilters->objs);
>>> +    virHashFree(nwfilters->objsName);
>>> +}
>>> +
>>> +
>>>    void
>>>    virNWFilterObjListFree(virNWFilterObjListPtr nwfilters)
>>>    {
>>> -    size_t i;
>>> -    for (i = 0; i < nwfilters->count; i++)
>>> -        virObjectUnref(nwfilters->objs[i]);
>>> -    VIR_FREE(nwfilters->objs);
>>> -    VIR_FREE(nwfilters);
>>> +    virObjectUnref(nwfilters);
>>>    }
>>>
>>>
>>> @@ -160,8 +181,23 @@ virNWFilterObjListNew(void)
>>>    {
>>>        virNWFilterObjListPtr nwfilters;
>>>
>>> -    if (VIR_ALLOC(nwfilters) < 0)
>>> +    if (virNWFilterObjInitialize() < 0)
>>> +        return NULL;
>>> +
>>> +    if (!(nwfilters = virObjectRWLockableNew(virNWFilterObjListClass)))
>>> +        return NULL;
>>> +
>>> +    if (!(nwfilters->objs = virHashCreate(10, virObjectFreeHashData))) {
> [1] As part of the magic of hash tables, when an element is removed from
> the hash table the virObjectFreeHashData is called which does a
> virObjectUnref...

Ah. I was looking for 'symmetry' ... so ideally we would have automatic 
increase  of the refcount as well.

    Stefan




More information about the libvir-list mailing list