diff --git a/libc/Android.bp b/libc/Android.bp index cd2a727ff..845945aed 100644 --- a/libc/Android.bp +++ b/libc/Android.bp @@ -1330,6 +1330,13 @@ genrule { cc_library_static { defaults: ["libc_defaults"], srcs: [ + "bionic/NetdClientDispatch.cpp", + "bionic/__cmsg_nxthdr.cpp", + "bionic/__errno.cpp", + "bionic/__gnu_basename.cpp", + "bionic/__libc_current_sigrtmax.cpp", + "bionic/__libc_current_sigrtmin.cpp", + "bionic/__set_errno.cpp", "bionic/abort.cpp", "bionic/accept.cpp", "bionic/accept4.cpp", @@ -1352,7 +1359,6 @@ cc_library_static { "bionic/clock_nanosleep.cpp", "bionic/clone.cpp", "bionic/close.cpp", - "bionic/__cmsg_nxthdr.cpp", "bionic/connect.cpp", "bionic/ctype.cpp", "bionic/dirent.cpp", @@ -1361,7 +1367,6 @@ cc_library_static { "bionic/epoll_create.cpp", "bionic/epoll_pwait.cpp", "bionic/epoll_wait.cpp", - "bionic/__errno.cpp", "bionic/error.cpp", "bionic/eventfd_read.cpp", "bionic/eventfd_write.cpp", @@ -1387,7 +1392,6 @@ cc_library_static { "bionic/getpid.cpp", "bionic/getpriority.cpp", "bionic/gettid.cpp", - "bionic/__gnu_basename.cpp", "bionic/grp_pwd.cpp", "bionic/ifaddrs.cpp", "bionic/inotify_init.cpp", @@ -1395,8 +1399,6 @@ cc_library_static { "bionic/langinfo.cpp", "bionic/lchown.cpp", "bionic/lfs64_support.cpp", - "bionic/__libc_current_sigrtmax.cpp", - "bionic/__libc_current_sigrtmin.cpp", "bionic/libc_init_common.cpp", "bionic/libgen.cpp", "bionic/link.cpp", @@ -1415,9 +1417,8 @@ cc_library_static { "bionic/mknod.cpp", "bionic/mntent.cpp", "bionic/mremap.cpp", - "bionic/netdb.cpp", - "bionic/NetdClientDispatch.cpp", "bionic/net_if.cpp", + "bionic/netdb.cpp", "bionic/netinet_in.cpp", "bionic/nl_types.cpp", "bionic/open.cpp", @@ -1444,7 +1445,6 @@ cc_library_static { "bionic/semaphore.cpp", "bionic/send.cpp", "bionic/setegid.cpp", - "bionic/__set_errno.cpp", "bionic/seteuid.cpp", "bionic/setpgrp.cpp", "bionic/sigaction.cpp", @@ -1470,21 +1470,24 @@ cc_library_static { "bionic/socket.cpp", "bionic/stat.cpp", "bionic/statvfs.cpp", + "bionic/stdlib_l.cpp", "bionic/strchrnul.cpp", "bionic/strerror.cpp", "bionic/strerror_r.cpp", + "bionic/string_l.cpp", + "bionic/strings_l.cpp", "bionic/strsignal.cpp", "bionic/strtold.cpp", "bionic/symlink.cpp", "bionic/sync_file_range.cpp", - "bionic/sysinfo.cpp", - "bionic/syslog.cpp", "bionic/sys_msg.cpp", "bionic/sys_sem.cpp", "bionic/sys_shm.cpp", "bionic/sys_siglist.c", "bionic/sys_signame.c", "bionic/sys_time.cpp", + "bionic/sysinfo.cpp", + "bionic/syslog.cpp", "bionic/system_properties.cpp", "bionic/tdestroy.cpp", "bionic/termios.cpp", @@ -1494,6 +1497,7 @@ cc_library_static { "bionic/unlink.cpp", "bionic/wait.cpp", "bionic/wchar.cpp", + "bionic/wchar_l.cpp", "bionic/wcstod.cpp", "bionic/wctype.cpp", "bionic/wmempcpy.cpp", diff --git a/libc/bionic/locale.cpp b/libc/bionic/locale.cpp index 38e15b713..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,64 +192,8 @@ locale_t uselocale(locale_t new_locale) { } if (new_locale != NULL) { - *locale_storage = new_locale; + *get_current_locale_ptr() = 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); +}