[pulseaudio-discuss] [PATCH 2/6] Turn device ports into reference counted objects
Colin Guthrie
gmane at colin.guthr.ie
Wed Nov 9 01:57:20 PST 2011
'Twas brillig, and David Henningsson at 09/11/11 09:42 did gyre and gimble:
> So; I think we've discussed the general case enough, back to where we
> started:
>
> I think this is cleaner and gives better error handling:
>
> void foo_free(foo* f)
> {
> if (!f)
> return;
> /* Possibly more destruction stuff here */
> pa_xfree(f);
> }
>
>
> /* Somewhere else */
> foo_free(bar->f);
>
> Than this:
>
> void foo_free(foo* f)
> {
> pa_assert(f);
> /* Possibly more destruction stuff here */
> pa_xfree(f);
> }
>
> /* Somewhere else */
> if (bar->f)
> foo_free(bar->f);
>
>
> The most common case for bar->f being null is that the bar object was
> not completely initialized. In addition, in destructors you should never
> throw exceptions.
>
> If adjusting my code from the IMO better approach to the IMO worse
> approach is what it takes to get the code in, I'll obviously do it. Let
> me know if that is necessary.
I could fairly easily be persuaded to agree that for "free" functions as
you listed above, asserting is likely overkill. After all pa_xfree(NULL)
is quite happy, so why should any higher level free function complain
more bitterly?
But free functions are arguably a particular class of function. Not
calling free properly only (usually) results in memory leaks.
I certainly wouldn't like a module to call pa_sink_input_move_to() with
invalid pointers and have that handled gracefully. I'd like the
conditions that lead up to the incorrect call to be very much reported
in a backtrace should it ever get out in a release.
Otherwise what happens? The stream is not moved and a something gets
written in a log and some key functionality just doesn't work but often
the user will be none the wise... "Hmm, I thought plugging in my USB was
meant to switch my music to it but it didn't... ho hum never mine"...
just an anonymous entry in a log and nothing gets reported etc. etc.
So for this class of problem, that is clear programming error - using
the APIs wrong - I'm still very much in favour of the assert usage.
But that's just my opinion, and I know it's certainly far from universal.
Col
--
Colin Guthrie
gmane(at)colin.guthr.ie
http://colin.guthr.ie/
Day Job:
Tribalogic Limited http://www.tribalogic.net/
Open Source:
Mageia Contributor http://www.mageia.org/
PulseAudio Hacker http://www.pulseaudio.org/
Trac Hacker http://trac.edgewall.org/
More information about the pulseaudio-discuss
mailing list