From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.2 (2018-09-13) on dcvr.yhbt.net X-Spam-Level: X-Spam-ASN: AS22989 209.51.188.0/24 X-Spam-Status: No, score=-3.7 required=3.0 tests=AWL,BAYES_00,DKIM_INVALID, DKIM_SIGNED,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, RCVD_IN_DNSWL_MED,SPF_HELO_NONE,SPF_PASS shortcircuit=no autolearn=ham autolearn_force=no version=3.4.2 Received: from lists.gnu.org (lists.gnu.org [209.51.188.17]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by dcvr.yhbt.net (Postfix) with ESMTPS id 97E941F463 for ; Tue, 17 Dec 2019 13:45:23 +0000 (UTC) Received: from localhost ([::1]:40656 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ihDAA-00037m-33 for normalperson@yhbt.net; Tue, 17 Dec 2019 08:45:22 -0500 Received: from eggs.gnu.org ([2001:470:142:3::10]:42024) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ihDA3-00037a-H8 for bug-gnulib@gnu.org; Tue, 17 Dec 2019 08:45:17 -0500 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ihDA2-0004Sh-5f for bug-gnulib@gnu.org; Tue, 17 Dec 2019 08:45:15 -0500 Received: from mo6-p00-ob.smtp.rzone.de ([2a01:238:20a:202:5300::1]:28313) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.71) (envelope-from ) id 1ihDA1-0004C7-FP for bug-gnulib@gnu.org; Tue, 17 Dec 2019 08:45:14 -0500 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; t=1576590310; s=strato-dkim-0002; d=clisp.org; h=Message-ID:Date:Subject:To:From:X-RZG-CLASS-ID:X-RZG-AUTH:From: Subject:Sender; bh=TavRow06kim/61+tJahepTGK4TxAUrfapHN4s8mZrG0=; b=gItA8drv4xG/YZH9OVQeX104V4TJYBFqhD2MhZGuk0AN3VxlfV1UY2Twr2Z4xFWxtL y8YpjHz1xZnQxPdeXWmVqWnOs9CQK9+vdHLEYrzl3a4cQsGhhPeZpQqQU4JIA2vYSlZa 0/8pEvjbvpFytJjlqQZWdkUcABsgY/mD5P0W8PCNYT5SXk6LTLC0I1lfK2GBVxu+uRlT Dg+WnutCCBUVaEPUYdDi3iLBLKfPSjLrH4qRaBsuJ1Siz9oyq2qo2TzE3UJVRDanDJot 44V9P6J/SHviLO5zq8xDURhxA4+qcLtNkUSDfRm2g13KBmV8eTK0+AOkxIew9Tb7BeNG iEsg== X-RZG-AUTH: ":Ln4Re0+Ic/6oZXR1YgKryK8brlshOcZlIWs+iCP5vnk6shH+AHjwLuWOH6fzxfs=" X-RZG-CLASS-ID: mo00 Received: from bruno.haible.de by smtp.strato.de (RZmta 46.0.7 DYNA|AUTH) with ESMTPSA id t0ad5bvBHDj91Bh (using TLSv1 with cipher ECDHE-RSA-AES256-SHA (curve X9_62_prime256v1 with 256 ECDH bits, eq. 3072 bits RSA)) (Client did not present a certificate); Tue, 17 Dec 2019 14:45:09 +0100 (CET) From: Bruno Haible To: bug-gnulib@gnu.org Subject: hard-locale: make multithread-safe Date: Tue, 17 Dec 2019 14:45:09 +0100 Message-ID: <175192568.e2XXTFFdkW@omega> User-Agent: KMail/5.1.3 (Linux/4.4.0-166-generic; KDE/5.18.0; x86_64; ; ) MIME-Version: 1.0 Content-Transfer-Encoding: 7Bit Content-Type: text/plain; charset="us-ascii" X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 2a01:238:20a:202:5300::1 X-BeenThere: bug-gnulib@gnu.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Gnulib discussion list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: bug-gnulib-bounces+normalperson=yhbt.net@gnu.org Sender: "bug-gnulib" Hi Paul, Here is a proposed patch to make the hard_locale() function multithread-safe. This is needed because our mbrtowc() override relies on hard_locale, and mbrtowc obviously must be multi-thread safe (that's one of its main features, compared to mbtowc). The previous hard_locale code tries to guess whether a locale is in fact a "C"/"POSIX" locale, although it is not apparent from its name. This was a case to worry about between 1995 and 2000, when many systems did not have working locales. This has changed: Nowadays nearly all platforms honour the locale names with some localized behaviour, except OpenBSD, Minix, and Android. It's not my priority to optimize for these three systems. But if you want to keep optimizations for these platforms, we could add #ifs for these platforms. 2019-12-17 Bruno Haible hard-locale: Make multithread-safe. * lib/hard-locale.h (hard_locale): Move documentation to here. * lib/hard-locale.c: Don't include . (GLIBC_VERSION): Remove macro. (hard_locale): Assume that all systems name the "C" and "POSIX" locales "C" or "POSIX". Invoke setlocale_null instead of setlocale. * modules/hard-locale (Depends-on): Remove strdup. Add setlocale-null. diff --git a/lib/hard-locale.h b/lib/hard-locale.h index 8f1da96..160674b 100644 --- a/lib/hard-locale.h +++ b/lib/hard-locale.h @@ -20,6 +20,9 @@ # include -bool hard_locale (int); +/* Return true if the specified CATEGORY of the current locale is hard, i.e. + different from the C or POSIX locale that has a fixed behavior. + CATEGORY must be one of the LC_* values, but not LC_ALL. */ +extern bool hard_locale (int category); #endif /* HARD_LOCALE_H_ */diff --git a/lib/hard-locale.c b/lib/hard-locale.c index dcfcad6..4a2adab 100644 --- a/lib/hard-locale.c +++ b/lib/hard-locale.c @@ -21,52 +21,15 @@ #include "hard-locale.h" #include -#include #include -#ifdef __GLIBC__ -# define GLIBC_VERSION __GLIBC__ -#elif defined __UCLIBC__ -# define GLIBC_VERSION 2 -#else -# define GLIBC_VERSION 0 -#endif - -/* Return true if the current CATEGORY locale is hard, i.e. if you - can't get away with assuming traditional C or POSIX behavior. */ bool hard_locale (int category) { - bool hard = true; - char const *p = setlocale (category, NULL); - - if (p) - { - if (2 <= GLIBC_VERSION) - { - if (strcmp (p, "C") == 0 || strcmp (p, "POSIX") == 0) - hard = false; - } - else - { - char *locale = strdup (p); - if (locale) - { - /* Temporarily set the locale to the "C" and "POSIX" locales - to find their names, so that we can determine whether one - or the other is the caller's locale. */ - if (((p = setlocale (category, "C")) - && strcmp (p, locale) == 0) - || ((p = setlocale (category, "POSIX")) - && strcmp (p, locale) == 0)) - hard = false; + char locale[SETLOCALE_NULL_MAX]; - /* Restore the caller's locale. */ - setlocale (category, locale); - free (locale); - } - } - } + if (setlocale_null (category, locale, sizeof (locale))) + return false; - return hard; + return !(strcmp (locale, "C") == 0 || strcmp (locale, "POSIX") == 0); } diff --git a/modules/hard-locale b/modules/hard-locale index d4463b7..02be90a 100644 --- a/modules/hard-locale +++ b/modules/hard-locale @@ -7,7 +7,7 @@ lib/hard-locale.c Depends-on: stdbool -strdup +setlocale-null configure.ac: