From e2fd01035ba85b906dbf0e6b6112b7f8ff52beef Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Tue, 11 Jul 2017 14:27:07 -0700 Subject: Move non-locale.h APIs out of locale.cpp. libandroid_support only needs the locale.h stuff. Test: make checkbuild Bug: None Change-Id: I0c53fe9d2df4f9ff4b99771727034508bc89cb32 --- libc/bionic/locale.cpp | 56 -------------------------------------------- libc/bionic/stdlib_l.cpp | 59 +++++++++++++++++++++++++++++++++++++++++++++++ libc/bionic/string_l.cpp | 42 +++++++++++++++++++++++++++++++++ libc/bionic/strings_l.cpp | 38 ++++++++++++++++++++++++++++++ libc/bionic/wchar_l.cpp | 38 ++++++++++++++++++++++++++++++ 5 files changed, 177 insertions(+), 56 deletions(-) create mode 100644 libc/bionic/stdlib_l.cpp create mode 100644 libc/bionic/string_l.cpp create mode 100644 libc/bionic/strings_l.cpp create mode 100644 libc/bionic/wchar_l.cpp (limited to 'libc/bionic') diff --git a/libc/bionic/locale.cpp b/libc/bionic/locale.cpp index 38e15b713..07f856933 100644 --- a/libc/bionic/locale.cpp +++ b/libc/bionic/locale.cpp @@ -178,59 +178,3 @@ locale_t uselocale(locale_t new_locale) { return old_locale; } - -int strcasecmp_l(const char* s1, const char* s2, locale_t) { - return strcasecmp(s1, s2); -} - -int strcoll_l(const char* s1, const char* s2, locale_t) { - return strcoll(s1, s2); -} - -char* strerror_l(int error, locale_t) { - return strerror(error); -} - -int strncasecmp_l(const char* s1, const char* s2, size_t n, locale_t) { - return strncasecmp(s1, s2, n); -} - -double strtod_l(const char* s, char** end_ptr, locale_t) { - return strtod(s, end_ptr); -} - -float strtof_l(const char* s, char** end_ptr, locale_t) { - return strtof(s, end_ptr); -} - -long strtol_l(const char* s, char** end_ptr, int base, locale_t) { - return strtol(s, end_ptr, base); -} - -long double strtold_l(const char* s, char** end_ptr, locale_t) { - return strtold(s, end_ptr); -} - -long long strtoll_l(const char* s, char** end_ptr, int base, locale_t) { - return strtoll(s, end_ptr, base); -} - -unsigned long strtoul_l(const char* s, char** end_ptr, int base, locale_t) { - return strtoul(s, end_ptr, base); -} - -unsigned long long strtoull_l(const char* s, char** end_ptr, int base, locale_t) { - return strtoull(s, end_ptr, base); -} - -size_t strxfrm_l(char* dst, const char* src, size_t n, locale_t) { - return strxfrm(dst, src, n); -} - -int wcscasecmp_l(const wchar_t* ws1, const wchar_t* ws2, locale_t) { - return wcscasecmp(ws1, ws2); -} - -int wcsncasecmp_l(const wchar_t* ws1, const wchar_t* ws2, size_t n, locale_t) { - return wcsncasecmp(ws1, ws2, n); -} diff --git a/libc/bionic/stdlib_l.cpp b/libc/bionic/stdlib_l.cpp new file mode 100644 index 000000000..18e9f86fa --- /dev/null +++ b/libc/bionic/stdlib_l.cpp @@ -0,0 +1,59 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +double strtod_l(const char* s, char** end_ptr, locale_t) { + return strtod(s, end_ptr); +} + +float strtof_l(const char* s, char** end_ptr, locale_t) { + return strtof(s, end_ptr); +} + +long strtol_l(const char* s, char** end_ptr, int base, locale_t) { + return strtol(s, end_ptr, base); +} + +long double strtold_l(const char* s, char** end_ptr, locale_t) { + return strtold(s, end_ptr); +} + +long long strtoll_l(const char* s, char** end_ptr, int base, locale_t) { + return strtoll(s, end_ptr, base); +} + +unsigned long strtoul_l(const char* s, char** end_ptr, int base, locale_t) { + return strtoul(s, end_ptr, base); +} + +unsigned long long strtoull_l(const char* s, char** end_ptr, int base, locale_t) { + return strtoull(s, end_ptr, base); +} + diff --git a/libc/bionic/string_l.cpp b/libc/bionic/string_l.cpp new file mode 100644 index 000000000..66bfb0e62 --- /dev/null +++ b/libc/bionic/string_l.cpp @@ -0,0 +1,42 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +int strcoll_l(const char* s1, const char* s2, locale_t) { + return strcoll(s1, s2); +} + +char* strerror_l(int error, locale_t) { + return strerror(error); +} + +size_t strxfrm_l(char* dst, const char* src, size_t n, locale_t) { + return strxfrm(dst, src, n); +} diff --git a/libc/bionic/strings_l.cpp b/libc/bionic/strings_l.cpp new file mode 100644 index 000000000..0983ab1de --- /dev/null +++ b/libc/bionic/strings_l.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +int strcasecmp_l(const char* s1, const char* s2, locale_t) { + return strcasecmp(s1, s2); +} + +int strncasecmp_l(const char* s1, const char* s2, size_t n, locale_t) { + return strncasecmp(s1, s2, n); +} diff --git a/libc/bionic/wchar_l.cpp b/libc/bionic/wchar_l.cpp new file mode 100644 index 000000000..0a131e878 --- /dev/null +++ b/libc/bionic/wchar_l.cpp @@ -0,0 +1,38 @@ +/* + * Copyright (C) 2017 The Android Open Source Project + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions + * are met: + * * Redistributions of source code must retain the above copyright + * notice, this list of conditions and the following disclaimer. + * * Redistributions in binary form must reproduce the above copyright + * notice, this list of conditions and the following disclaimer in + * the documentation and/or other materials provided with the + * distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS + * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT + * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS + * FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE + * COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, + * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, + * BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS + * OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED + * AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT + * OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF + * SUCH DAMAGE. + */ + +#include +#include + +int wcscasecmp_l(const wchar_t* ws1, const wchar_t* ws2, locale_t) { + return wcscasecmp(ws1, ws2); +} + +int wcsncasecmp_l(const wchar_t* ws1, const wchar_t* ws2, size_t n, locale_t) { + return wcsncasecmp(ws1, ws2, n); +} -- cgit v1.2.3 From 1a8b7f2d1ca7c605e8e0e6a707a8c4bc9839dcda Mon Sep 17 00:00:00 2001 From: Dan Albert Date: Wed, 12 Jul 2017 13:47:42 -0700 Subject: Add a non-TLS slot implementation of locale.cpp. libandroid_support shouldn't be using Bionic's TLS slot. Add a thread_local based implementation. We can't use the thread_local implementation in bionic because the linker needs this and pthread thread-locals (which is how thread_local is implemented) doesn't work that early. Test: make checkbuild Test: adb shell /data/nativetest/bionic-unit-tests/bionic-unit-tests Bug: https://github.com/android-ndk/ndk/issues/300 Change-Id: I7dcbf554ade2264d541d722fa3f86df04926e67a --- libc/bionic/locale.cpp | 25 ++++++++++++++++++++++--- 1 file changed, 22 insertions(+), 3 deletions(-) (limited to 'libc/bionic') diff --git a/libc/bionic/locale.cpp b/libc/bionic/locale.cpp index 07f856933..08c9401fd 100644 --- a/libc/bionic/locale.cpp +++ b/libc/bionic/locale.cpp @@ -37,7 +37,15 @@ #include "private/bionic_macros.h" +#if defined(__BIONIC_BUILD_FOR_ANDROID_SUPPORT) +#define USE_TLS_SLOT 0 +#else +#define USE_TLS_SLOT 1 +#endif + +#if USE_TLS_SLOT #include "bionic/pthread_internal.h" +#endif // We only support two locales, the "C" locale (also known as "POSIX"), // and the "C.UTF-8" locale (also known as "en_US.UTF-8"). @@ -70,6 +78,10 @@ size_t __ctype_get_mb_cur_max() { } } +#if !USE_TLS_SLOT +static thread_local locale_t g_current_locale; +#endif + static pthread_once_t g_locale_once = PTHREAD_ONCE_INIT; static lconv g_locale; @@ -163,9 +175,16 @@ char* setlocale(int category, const char* locale_name) { return const_cast(__bionic_current_locale_is_utf8 ? "C.UTF-8" : "C"); } +static locale_t* get_current_locale_ptr() { +#if USE_TLS_SLOT + return &__get_bionic_tls().locale; +#else + return &g_current_locale; +#endif +} + locale_t uselocale(locale_t new_locale) { - locale_t* locale_storage = &__get_bionic_tls().locale; - locale_t old_locale = *locale_storage; + locale_t old_locale = *get_current_locale_ptr(); // If this is the first call to uselocale(3) on this thread, we return LC_GLOBAL_LOCALE. if (old_locale == NULL) { @@ -173,7 +192,7 @@ locale_t uselocale(locale_t new_locale) { } if (new_locale != NULL) { - *locale_storage = new_locale; + *get_current_locale_ptr() = new_locale; } return old_locale; -- cgit v1.2.3