[libvirt RFC PATCH 0/5] eliminating VIR_FREE in the *Clear() functions
Michal Privoznik
mprivozn at redhat.com
Fri Feb 12 09:19:16 UTC 2021
On 2/12/21 6:54 AM, Laine Stump wrote:
> I've looked at a few of these, and one thing I've found is that very
> often we have a function called somethingSomethingClear(), and:
>
> 1) The only places it is ever called will immediately free the memory
> of the object as soon as they clear it.
>
> and very possibly
>
> 2) It doesn't actually *clear* everything. Some items are cleared via VIR_FREE(), but then some of the other pointers call
>
> bobLoblawFree(def->bobloblaw)
>
> and then don't actually set def->bobloblaw to NULL - so the functions
> aren't actually "Clearing", they're "Freeing and then clearing a few
> things, but not everything".
>
> So I'm wondering if it is worthwhile to
>
> A) audit all the *Clear() functions and rename the functions that
> don't actually need to clear the contents to be, e.g.
> bobLobLawFreeContents(), while also replacing VIR_FREE with g_free().
> (this is what I've done in these 5 patches)
>
> or if we should
>
> B) just do the wholesale approach and (as danpb suggested last week)
> change all VIR_FREE in *Clear() functions to g_free(), and put a
> "memset(obj, 0, sizeof(*obj))" at the end of each function, ignoring
> whether or not we actually need that.
>
> (B) would obviously be much faster to get done, and simpler for
> everyone to keep track of what's happening, but of course it is less
> efficient. Very likely this efficiency is completely meaningless in
> the large scheme (even in the medium or small scheme).
>
> (I actually like the idea of 0'ing out *everything*[*] when we're done
> with it, extra cycles be damned! I think of the two choices above,
> after going through this exercise, I'd say (B) is a more reasonable
> choice, but since I tried this, I thought I'd send it and see if
> anyone else has an opinion (or different idea)
>
> [*](including all those places I've replaced VIR_FREE with g_free in
> the name of "progress?")
>
> Laine Stump (5):
> conf: rename and narrow scope of virDomainHostdevDefClear()
> conf: rename virDomainHostdevSubsysSCSIClear
> conf: replace pointless VIR_FREEs with g_free in
> virDomainVideoDefClear()
> conf: don't call virDomainDeviceInfoClear from
> virDomainDeviceInfoParseXML
> conf: replace virDomainDeviceInfoClear with
> virDomainDeviceInfoFreeContents
>
> src/conf/device_conf.c | 15 +++-----
> src/conf/device_conf.h | 2 +-
> src/conf/domain_conf.c | 81 ++++++++++++++++++++--------------------
> src/conf/domain_conf.h | 1 -
> src/libvirt_private.syms | 1 -
> 5 files changed, 47 insertions(+), 53 deletions(-)
>
I don't like change and thus prefer keeping *Clear() with explicit
memset(0) - if needed, but don't want to stop progress.
Michal
More information about the libvir-list
mailing list