* David Malcolm:

>
> My first thought here was that we should have a way to get all three at
> once, but it turns out that parse_basever does its own caching
> internally.
>
> I don't think the current implementation is thread-safe; parse_basever
> has:
>
>   static int s_major = -1, s_minor, s_patchlevel;
>
>   if (s_major == -1)
>     if (sscanf (BASEVER, "%d.%d.%d", &s_major, &s_minor, &s_patchlevel) != 3)
>       {
>       sscanf (BASEVER, "%d.%d", &s_major, &s_minor);
>       s_patchlevel = 0;
>       }
>
> I think there's a race here:

Right, it's not thread-safe.

One possiblity would be to store all three numbers in one unsigned
int, and used relaxed MO loads and stores.  A zero value would
indicate that initialization is needed.

It will break if there are ever more than 1000 or so GCC releases, but
it will be good for a while.

Reply via email to