This is a live mirror of the Perl 5 development currently hosted at https://github.com/perl/perl5
locale.c: Revamp my_strerror() for thread-safeness
authorKarl Williamson <khw@cpan.org>
Wed, 20 Jul 2016 16:33:40 +0000 (10:33 -0600)
committerKarl Williamson <khw@cpan.org>
Fri, 29 Jul 2016 21:46:46 +0000 (15:46 -0600)
commit6ebbc8624b039b6346d70b097fe51229b3938d1b
tree3a3dabd8ff5075596d355c003f470f2357440fa6
parent8ebda0e9b901456f365e0c5fbdbba0fef14054fe
locale.c: Revamp my_strerror() for thread-safeness

This commit is the first step in making locale handling thread-safe.

[perl #127708] was solved for 5.24 by adding a mutex in this function.
That bug was caused by the code changing the locale even if the calling
program is not consciously using locales.

Posix 2008 introduced thread-safe locale functions.  This commit changes
this function to use them if the perl is threaded and the platform has
them available.  This means that the mutex is avoided on modern
platforms.

It restructures the function to return a mortal copy of the error
message.  This is a step towards making the function completely thread
safe.  Right now, as documented, if you do 'use locale', locale handling
isn't thread-safe.

A global C locale object is created and used here if necessary.  It is
destroyed at the end of the program.

Note that some platforms have a strerror_r(), which is automatically
used instead of strerror() if available.  It differs form straight
strerror() by taking a buffer to place the returned string, so the
return does not point to internal static storage.  One could test for
the existence of this and avoid the mortal copy.
embedvar.h
locale.c
makedef.pl
perl.c
perl.h
perlapi.h
perlvars.h