Re: [Mesa-dev] [PATCH] util: port _mesa_strto[df] to C
On Tue, Mar 17, 2015 at 12:32 AM, Ian Romanick i...@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 kusmab...@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
Re: [Mesa-dev] [PATCH] util: port _mesa_strto[df] to C
On Sun, Mar 15, 2015 at 12:05 PM, Erik Faye-Lund kusmab...@gmail.com wrote: _mesa_strtod and _mesa_strtof are only used from the GLSL compiler, 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. Signed-off-by: Erik Faye-Lund kusmab...@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++. This looks good to me. It'd be nice if idr could take a look as well. Reviewed-by: Matt Turner matts...@gmail.com The one annoyance is that autotools doesn't work across this change. After applying this patch to a configured and built tree, you'll get make[4]: *** No rule to make target '../../../mesa/src/util/strtod.cpp', needed by 'libmesautil_la-strtod.lo'. Stop. when running make. To fix, run sed -i -e 's/strtod.cpp/strtod.c/' src/util/.deps/libmesautil_la-strtod.Plo The file will be in your build tree. ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH] util: port _mesa_strto[df] to C
On 15/03/15 19:05, Erik Faye-Lund wrote: _mesa_strtod and _mesa_strtof are only used from the GLSL compiler, 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. Signed-off-by: Erik Faye-Lund kusmab...@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++. Fwiw this file/code should not cause any linkage to the C++ runtime, although it's a nice cleanup imho. There is a small catch though - _mesa_strtof can be used by the standalone glsl_compiler and perhaps glcpp. I could not find any references in the manpages about locale_t's implementation although it guaranteed to be a struct for every platform we can just add an assert in _mesa_strtof and fix the fallouts later ? -Emil ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH] util: port _mesa_strto[df] to C
On Mon, Mar 16, 2015 at 10:13 PM, Emil Velikov emil.l.veli...@gmail.com wrote: On 15/03/15 19:05, Erik Faye-Lund wrote: _mesa_strtod and _mesa_strtof are only used from the GLSL compiler, 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. Signed-off-by: Erik Faye-Lund kusmab...@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++. Fwiw this file/code should not cause any linkage to the C++ runtime, although it's a nice cleanup imho. There is a small catch though - _mesa_strtof can be used by the standalone glsl_compiler and perhaps glcpp. Good point, so perhaps this on top? ---8--- diff --git a/src/glsl/glcpp/glcpp.c b/src/glsl/glcpp/glcpp.c index 5144516..c62f4ef 100644 --- a/src/glsl/glcpp/glcpp.c +++ b/src/glsl/glcpp/glcpp.c @@ -29,6 +29,7 @@ #include glcpp.h #include main/mtypes.h #include main/shaderobj.h +#include util/strtod.h extern int glcpp_parser_debug; @@ -168,6 +169,8 @@ main (int argc, char *argv[]) if (shader == NULL) return 1; + _mesa_locale_init(); + ret = glcpp_preprocess(ctx, shader, info_log, NULL, gl_ctx); printf(%s, shader); diff --git a/src/glsl/main.cpp b/src/glsl/main.cpp index ccac839..b23b583 100644 --- a/src/glsl/main.cpp +++ b/src/glsl/main.cpp @@ -38,6 +38,7 @@ #include program/hash_table.h #include loop_analysis.h #include standalone_scaffolding.h +#include util/strtod.h static int glsl_version = 330; @@ -52,6 +53,8 @@ initialize_context(struct gl_context *ctx, gl_api api) { initialize_context_to_defaults(ctx, api); + _mesa_locale_init(); + /* The standalone compiler needs to claim support for almost * everything in order to compile the built-in functions. */ ---8--- ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
Re: [Mesa-dev] [PATCH] util: port _mesa_strto[df] to C
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. 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 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. It also occurs to me that the neither the old code nor the new code ever call freelocale. 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. Signed-off-by: Erik Faye-Lund kusmab...@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); ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev
[Mesa-dev] [PATCH] util: port _mesa_strto[df] to C
_mesa_strtod and _mesa_strtof are only used from the GLSL compiler, 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. Signed-off-by: Erik Faye-Lund kusmab...@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); -- 2.1.0 ___ mesa-dev mailing list mesa-dev@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/mesa-dev