[Mesa-dev] [PATCH] ralloc: Use __attribute__((destructor)) instead of atexit(3)
Jose Fonseca
jfonseca at vmware.com
Fri Sep 11 03:51:39 PDT 2015
On 11/09/15 00:35, Erik Faye-Lund wrote:
> On Mon, Sep 7, 2015 at 3:54 PM, Jose Fonseca <jfonseca at vmware.com> wrote:
>> On 07/09/15 10:17, Jean-Sébastien Pédron wrote:
>>>
>>> On 04.09.2015 01:37, Matt Turner wrote:
>>>>
>>>> You need to test for this support in configure.ac. It's as simple as
>>>> adding a call to AX_GCC_FUNC_ATTRIBUTE in the existing alphabetized
>>>> list and then a little bit of preprocessor in src/util/macros.h.
>>>
>>>
>>> Should the code fallbacks on atexit(3) if the attribute is not
>>> supported?
>>
>>
>> At least on Windows, with MSVC, atexit should be the right thing to do,
>> since we statically link MSVC RunTime,
>>
>>
>>> Can I use the HAVE_FUNC_ATTRIBUTE_DESTRUCTOR macro in
>>>
>>> ralloc.c for this purpose?
>>
>>
>>
>>
>>
>> For the record, another alternative (way more portable), is you have a
>> simple .cpp file with a static destructior:
>>
>>
>> class AtExit
>> {
>> public:
>> ~AtExit() {
>> // do what must be done
>> }
>> };
>>
>> AtExit atExit();
>>
>>
>> After all, it seems wrong to use non-standard C to replicate what standard
>> C++ can do.
>
> That sounds nice and all, until you stumble over problems like
> STB_GNU_UNIQUE, which makes renders C++ static destructors completely
> unusable on Linux if you have even a single static variable in a
> method in your C++ code.
>
> Read up on it on Read
> http://gcc.gnu.org/ml/gcc-help/2011-05/msg00450.html if you feel like
> being depressed.
>
I read up to https://gcc.gnu.org/ml/gcc-help/2011-05/msg00450.html but
it sounded like a problem in dlclose.
> Unfortunately, C++ and it's many questionable implementations make up
> an unpredictable beast that keeps on throwing curve-balls that makes
> it no fun at all for library development.
The irony is that, __attribute__((destructor)) is one of those sources
of unpredictability (the order destructors gets called is almost
unpredictable), which is probably why it was never added to standard C.
I can't look at using C with non-standard extensions on a good light,
and using extended C (ie, C++) under a bad light. Using and abusing
non-standard extensions will surely throw curve-balls too. At least
those curve-balls threw by C++ are shared by a lot of other people, more
likely to get sorted out without our intervention.
Finally, dlclose'ing shared objects is inherently like walking on a mine
field, no matter what language one uses. IMHO, if we can't support
dlclose safely/robustly, might as well slap -Wl,-z,nodelete on our
shared objects, ie. just pretend everything was statically linked.
Jose
More information about the mesa-dev
mailing list