Hi Andrew, What about replacing static void *tls = NULL; by thread_local void *tls = NULL;
The "thread_local" is certainly supported in C++ from C++11 and C11 has the _Thread_local. (see http://en.cppreference.com/w/cpp/language/storage_duration) and so it should be portable and address the issue cleanly. Now, my second question would be for the "tls". The variable "tls" is used by tls_set_ptr and tls_get_ptr which are only used by glp_init_env, glp_free_env and get_env_ptr. Proposed solution: --- As of now the glp_init_env and glp_free_env are taking a void. But we get very simply put a ENV *env as part of their input. The "env" would then no longer be a global variable but instead be a scope variable in the frame where the solver is called. --- several function glpapi06.c / glpapi08.c and glpapi09.c are using get_env_ptr to get the pointer. Instead we could add the env variable as part of their input. I may be very naive but the only negative impact I see from this solution is API breaks. Mathieu On 14 December 2016 at 18:56, Andrew Makhorin <[email protected]> wrote: > On Wed, 2016-12-14 at 18:28 +0100, Mathieu Dutour wrote: > > Please see > > http://lists.gnu.org/archive/html/help-glpk/2010-04/ > msg00038.html . > > > > If you are interested in this solution, I can post you a > > reentrant > > version of glpk/src/env/tls.c for GNU/Linux or MS Windows > > (from an old > > glpk distribution). > > Yes, thank you! > > I think this is the right solution. > > For a GNU/Linux version see > http://lists.gnu.org/archive/html/help-glpk/2010-04/msg00043.html > > Attached is a MS Windows dll version. > > You need to replace glpk/src/env/tls.c and then rebuild the package as > usual. > >
_______________________________________________ Help-glpk mailing list [email protected] https://lists.gnu.org/mailman/listinfo/help-glpk
