This is the mail archive of the cygwin-developers@cygwin.com mailing list for the Cygwin project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FYI on private static object construction


Just an FYI to the Cygwin team:

It appears from discussion on the gcc list that private static
objects in C++ functions are constructed when they are encountered
in program flow.  E.g.:

f()
{
    whatever...
    // "x" is constructed when program flow gets here
    static some_class x;
    whatever...
}

This construction is not thread-safe in gcc at present.  Nor does
it appear that it is required to be so by the C++ standard.  This
can result in multiple construction of the object, and multiple
parallel calls to atexit() (used to schedule destruction), which
is also not currently thread-safe, and can cause null pointer
dereferences.

So I would recommend that in Cygwin such objects be moved out of
functions to global scope, to avoid threading issues.

I suspect that this is what is causing my problems with atexit().

Gcc generates functions with "tcf" in the name (e.g. __tcf_0) for
this sort of code, so it is easy to tell whether a particular object
has the problem.

Joe Buehler


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]