[Mesa-dev] [PATCH] util: port _mesa_strto[df] to C

Erik Faye-Lund kusmabite at gmail.com
Mon Mar 16 17:46:17 PDT 2015


On Tue, Mar 17, 2015 at 12:32 AM, Ian Romanick <idr at freedesktop.org> wrote:
> On 03/15/2015 12:05 PM, Erik Faye-Lund wrote:
>> _mesa_strtod and _mesa_strtof are only used from the GLSL compiler,
>
> It's also used in the ARB_vertex_program / ARB_fragment_program
> assembler in src/prog.

Oh, right. Thanks for pointing that out.

>> so the locale doesn't need to be initialized before the first context
>> gets initialized. So let's use explicit initialization from the
>> one-time init code instead of depending on a C++ compiler to initialize
>> at image-load time.
>
> This is fairly close to the way Chia-I originally had it:
>
> http://lists.freedesktop.org/archives/mesa-dev/2014-April/058215.html
>
> Some discussion of alternate methods started:
>
> http://lists.freedesktop.org/archives/mesa-dev/2014-May/058861.html

Thanks for pointing me at this discussion, very useful.

> I'm a little concerned that having the initialization in Mesa and the
> function accessible to both Mesa and Gallium that we may set ourselves
> up for problems later.

Doesn't really sound like a ground-shattering risk to me. But perhaps
adding an assert verifying that initialization was done could offset
that risk?

> It also occurs to me that the neither the old code nor the new code ever
> call freelocale.

In OpenGL ES 2.0 and OpenGL 4.1, you have glReleaseShaderCompiler
which is intended for this kind of work. But I'm not sure a single
leak of a locale is really worth the implementation-effort.

> I think that's easier to fix with the static object
> method (using a destructor).
>
> I guess I'm kind of ambivalent about the change.

Yeah, especially initialization having to be done in three different
locations causes me to start losing some confidence that this is a
good idea.

>> Signed-off-by: Erik Faye-Lund <kusmabite at gmail.com>
>> ---
>>
>> Because of the recent discussion on libc++ and Mesa, I thought I'd
>> have a look into what parts of mesa depended on libc++, and I spotted
>> this file.
>>
>> In this case, it was rather trivial to port the code to plain C, making
>> it dead obvious that it doesn't depend on libc++. I'm not proposing all
>> C++ gets this treatment, but in this case it seems like a pretty
>> straight-forward way to make it obvious that this code does not depend
>> on libc++.
>>
>>  src/mesa/main/context.c           |  3 +++
>>  src/util/Makefile.sources         |  2 +-
>>  src/util/{strtod.cpp => strtod.c} | 14 ++++++++------
>>  src/util/strtod.h                 |  3 +++
>>  4 files changed, 15 insertions(+), 7 deletions(-)
>>  rename src/util/{strtod.cpp => strtod.c} (89%)
>>
>> diff --git a/src/mesa/main/context.c b/src/mesa/main/context.c
>> index 22c2341..de6a016 100644
>> --- a/src/mesa/main/context.c
>> +++ b/src/mesa/main/context.c
>> @@ -119,6 +119,7 @@
>>  #include "shared.h"
>>  #include "shaderobj.h"
>>  #include "util/simple_list.h"
>> +#include "util/strtod.h"
>>  #include "state.h"
>>  #include "stencil.h"
>>  #include "texcompress_s3tc.h"
>> @@ -398,6 +399,8 @@ one_time_init( struct gl_context *ctx )
>>        assert( sizeof(GLint) == 4 );
>>        assert( sizeof(GLuint) == 4 );
>>
>> +      _mesa_locale_init();
>> +
>>        _mesa_one_time_init_extension_overrides();
>>
>>        _mesa_get_cpu_features();
>> diff --git a/src/util/Makefile.sources b/src/util/Makefile.sources
>> index 560ea83..f930790 100644
>> --- a/src/util/Makefile.sources
>> +++ b/src/util/Makefile.sources
>> @@ -17,7 +17,7 @@ MESA_UTIL_FILES :=  \
>>       set.c \
>>       set.h \
>>       simple_list.h \
>> -     strtod.cpp \
>> +     strtod.c \
>>       strtod.h \
>>       texcompress_rgtc_tmp.h \
>>       u_atomic.h
>> diff --git a/src/util/strtod.cpp b/src/util/strtod.c
>> similarity index 89%
>> rename from src/util/strtod.cpp
>> rename to src/util/strtod.c
>> index 2b4dd98..a4a60e0 100644
>> --- a/src/util/strtod.cpp
>> +++ b/src/util/strtod.c
>> @@ -30,18 +30,20 @@
>>  #include <locale.h>
>>  #ifdef HAVE_XLOCALE_H
>>  #include <xlocale.h>
>> +static locale_t loc;
>>  #endif
>>  #endif
>>
>>  #include "strtod.h"
>>
>>
>> +void
>> +_mesa_locale_init(void)
>> +{
>>  #if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
>> -static struct locale_initializer {
>> -   locale_initializer() { loc = newlocale(LC_CTYPE_MASK, "C", NULL); }
>> -   locale_t loc;
>> -} loc_init;
>> +   loc = newlocale(LC_CTYPE_MASK, "C", NULL);
>>  #endif
>> +}
>>
>>  /**
>>   * Wrapper around strtod which uses the "C" locale so the decimal
>> @@ -51,7 +53,7 @@ double
>>  _mesa_strtod(const char *s, char **end)
>>  {
>>  #if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
>> -   return strtod_l(s, end, loc_init.loc);
>> +   return strtod_l(s, end, loc);
>>  #else
>>     return strtod(s, end);
>>  #endif
>> @@ -66,7 +68,7 @@ float
>>  _mesa_strtof(const char *s, char **end)
>>  {
>>  #if defined(_GNU_SOURCE) && defined(HAVE_XLOCALE_H)
>> -   return strtof_l(s, end, loc_init.loc);
>> +   return strtof_l(s, end, loc);
>>  #elif defined(HAVE_STRTOF)
>>     return strtof(s, end);
>>  #else
>> diff --git a/src/util/strtod.h b/src/util/strtod.h
>> index 02c25dd..b7e2beb 100644
>> --- a/src/util/strtod.h
>> +++ b/src/util/strtod.h
>> @@ -31,6 +31,9 @@
>>  extern "C" {
>>  #endif
>>
>> +extern void
>> +_mesa_locale_init(void);
>> +
>>  extern double
>>  _mesa_strtod(const char *s, char **end);
>>
>


More information about the mesa-dev mailing list