diff options
author | Ed Schouten <ed@nuxi.nl> | 2015-06-24 08:44:38 +0000 |
---|---|---|
committer | Ed Schouten <ed@nuxi.nl> | 2015-06-24 08:44:38 +0000 |
commit | e0cf3b9a3ca8d80d313d1e2e5b8c70d73d10e933 (patch) | |
tree | 9141a10ef3fbd7899b821275956fda61b01da73d /libcxx/include | |
parent | aa315fbb4c18b0bfcd54658f3f5b67600f097f8c (diff) | |
download | bcm5719-llvm-e0cf3b9a3ca8d80d313d1e2e5b8c70d73d10e933.tar.gz bcm5719-llvm-e0cf3b9a3ca8d80d313d1e2e5b8c70d73d10e933.zip |
Make support for thread-unsafe C functions optional.
One of the aspects of CloudABI is that it aims to help you write code
that is thread-safe out of the box. This is very important if you want
to write libraries that are easy to reuse. For CloudABI we decided to
not provide the thread-unsafe functions. So far this is working out
pretty well, as thread-unsafety issues are detected really early on.
The following patch adds a knob to libc++,
_LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS, that can be set to disable
thread-unsafe functions that can easily be avoided in practice. The
following functions are not thread-safe:
- <clocale>: locale handles should be preferred over setlocale().
- <cstdlib>: mbrlen(), mbrtowc() and wcrtomb() should be preferred over
their non-restartable counterparts.
- <ctime>: asctime(), ctime(), gmtime() and localtime() are not
thread-safe. The first two are also deprecated by POSIX.
Differential Revision: http://reviews.llvm.org/D8703
Reviewed by: marshall
llvm-svn: 240527
Diffstat (limited to 'libcxx/include')
-rw-r--r-- | libcxx/include/__config | 6 | ||||
-rw-r--r-- | libcxx/include/clocale | 2 | ||||
-rw-r--r-- | libcxx/include/cstdlib | 2 | ||||
-rw-r--r-- | libcxx/include/cstring | 2 | ||||
-rw-r--r-- | libcxx/include/ctime | 2 |
5 files changed, 14 insertions, 0 deletions
diff --git a/libcxx/include/__config b/libcxx/include/__config index adf11d3cc4a..62efbf80aa1 100644 --- a/libcxx/include/__config +++ b/libcxx/include/__config @@ -766,4 +766,10 @@ extern "C" void __sanitizer_annotate_contiguous_container( #define _LIBCPP_PROVIDES_DEFAULT_RUNE_TABLE #endif +// Thread-unsafe functions such as strtok(), mbtowc() and localtime() +// are not available. +#ifdef __CloudABI__ +#define _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS +#endif + #endif // _LIBCPP_CONFIG diff --git a/libcxx/include/clocale b/libcxx/include/clocale index f8b8f0dd34b..05fa9c6edda 100644 --- a/libcxx/include/clocale +++ b/libcxx/include/clocale @@ -45,7 +45,9 @@ lconv* localeconv(); _LIBCPP_BEGIN_NAMESPACE_STD using ::lconv; +#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS using ::setlocale; +#endif using ::localeconv; _LIBCPP_END_NAMESPACE_STD diff --git a/libcxx/include/cstdlib b/libcxx/include/cstdlib index 298040e3f49..55e15c82192 100644 --- a/libcxx/include/cstdlib +++ b/libcxx/include/cstdlib @@ -147,9 +147,11 @@ using ::ldiv; #undef lldiv using ::lldiv; #endif // _LIBCPP_HAS_NO_LONG_LONG +#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS using ::mblen; using ::mbtowc; using ::wctomb; +#endif using ::mbstowcs; using ::wcstombs; #ifdef _LIBCPP_HAS_QUICK_EXIT diff --git a/libcxx/include/cstring b/libcxx/include/cstring index 21c9155cd4d..d60b9923c6c 100644 --- a/libcxx/include/cstring +++ b/libcxx/include/cstring @@ -102,7 +102,9 @@ inline _LIBCPP_INLINE_VISIBILITY void* memchr( void* __s, int __c, si inline _LIBCPP_INLINE_VISIBILITY char* strstr( char* __s1, const char* __s2) {return ::strstr(__s1, __s2);} #endif +#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS using ::strtok; +#endif using ::memset; using ::strerror; using ::strlen; diff --git a/libcxx/include/ctime b/libcxx/include/ctime index fc4eb26f543..da9e3290bbb 100644 --- a/libcxx/include/ctime +++ b/libcxx/include/ctime @@ -61,10 +61,12 @@ using ::clock; using ::difftime; using ::mktime; using ::time; +#ifndef _LIBCPP_HAS_NO_THREAD_UNSAFE_C_FUNCTIONS using ::asctime; using ::ctime; using ::gmtime; using ::localtime; +#endif using ::strftime; _LIBCPP_END_NAMESPACE_STD |