xserver: Cleaning up memory allocation functions and macros
Eamon Walsh
efw at eamonwalsh.com
Sat Apr 28 19:58:36 PDT 2007
Magnus Vigerlöf wrote:
> On lördag 28 april 2007, Daniel Stone wrote:
> [...]
>>> * Neither have I seen MEMBUG being defined anywhere. Will anyone miss
>>> this feature if I remove it? There are code that ignore the case where
>>> the memory allocation functions return NULL (the option functions
>>> (addNewOption2 [1]), I don't know how to make it better without breaking
>>> the interface though), so my gut feeling is that it's not used very
>>> much/at all today.
>> Not really. I guess the best way of testing this would be to get a libc
>> modification in which did the same.
>
> I've used the memory allocation tracing features in glibc when tracking down
> the memory leaks in the hotplug path, maybe the hook-concept included in
> glibc can be used for this purpose when something like this is needed? Not
> usable for those system based on something else than glibc, I know..
IMHO, it really should be the job of libc to provide these features.
Also, what about ALLOCATE_LOCAL and DEALLOCATE_LOCAL? Are there any
target systems out there that still don't have a working alloca?
>
>>> * Is there a reason for the existence of both xmalloc (macro) and Xmalloc
>>> (wrapper function)? (apply this question on all memory functions) I'll go
>>> for the libc-variants wherever I can, but those functions that depends on
>>> a slightly different semantic than the libc ones, which name standard
>>> should be used? (I prefer the lower case prefix [xstrdup, xnf...].)
>> Probably to do with ABI concerns from 1993.
>
> Ok. So stick with the current and phase all these calls out as we go then.
> Good.
>
>>> * Use standard libc-functions
>>> - For every call to alloc/calloc/realloc/... there *must* be a check if
>>> it succeded to allocate the memory.
>>> - free() can take NULL as argument, so it's not needed to test for NULL
>>> before calling it.
>> Huzzah! Thankyou.
>
> :)
>
>>> * xstrdup() will be defined as a macro which can handle being passed
>>> NULL. strdup doesn't.
>> Sounds sensible, but you could also flag a warning if --enable-debug is
>> enabled, and we could fix all these cases and gradually transition to
>> using normal strdup()?
>
> Hmmm... If this is as easy as enabling a #warning if DEBUG is set, I think I
> need to make this a wrapper function instead. Otoh, that would make it a
> candidate to mark it with _X_DEPRECATED. I think I'll go for that instead if
> there's no objection.
>
+1 on all of the above.
>>> * xfreeZ() will be defined as a macro that set the pointer to NULL after
>>> freeing the memory with free(). Use *only* if the pointer must be set to
>>> NULL for some reason.
>> Is there any reason to do this? It just encourages the x*() wrappers
>> and makes the code less obvious to the casual observer.
>
> The code in some places will look nicer. However, I'm not sure I want this
> either (I just had to toss the idea up and see if anyone would shoot it
> down). I'll remove this one. Thanks.
I agree that this macro isn't necessary.
>
>>> * xnf* will be implemented as wrapper functions that will call FatalError
>>> if the libc-functions returned NULL when they shouldn't (i.e. more or
>>> less kept as-is). NOTE: Avoid these, use proper error-propagation instead
>>> (calling these should be considered a BUG).
>> Indeed. You can just mark these as _X_DEPRECATED and the compiler will
>> complain every time.
>
> And it's not that many really (200-400 places, thought it would be more..).
> But the tricky part will be to refactor the code so it'll handle the
> situation instead without breaking the interface. I'll change the call to one
> of these if proper checking is not made (and I can't fix it), so there will
> be some more, but we'll know where they are at least.
Calls which would break the interface could be changed to FatalError
explicitly as a temporary measure, with an XXX or TODO to fix the
interface later.
--Eamon W.
More information about the xorg
mailing list