Pull the pthread_key_t functions out of pthread.c.
This was originally motivated by noticing that we were setting the
wrong bits for the well-known tls entries. That was a harmless bug
because none of the well-known tls entries has a destructor, but
it's best not to leave land mines lying around.
Also add some missing POSIX constants, a new test, and fix
pthread_key_create's return value when we hit the limit.
Change-Id: Ife26ea2f4b40865308e8410ec803b20bcc3e0ed1
diff --git a/libc/bionic/sysconf.cpp b/libc/bionic/sysconf.cpp
index 6555a66..f4845e1 100644
--- a/libc/bionic/sysconf.cpp
+++ b/libc/bionic/sysconf.cpp
@@ -55,7 +55,6 @@
/* the following depends on our implementation */
#define SYSTEM_ATEXIT_MAX 65536 /* our implementation is unlimited */
-#define SYSTEM_THREAD_KEYS_MAX BIONIC_TLS_SLOTS
#define SYSTEM_THREAD_STACK_MIN 32768 /* lower values may be possible, but be conservative */
#define SYSTEM_THREAD_THREADS_MAX 2048 /* really unlimited */
@@ -302,10 +301,13 @@
// GETPW_R_SIZE_MAX ?
case _SC_LOGIN_NAME_MAX: return SYSTEM_LOGIN_NAME_MAX;
-#ifdef _POSIX_THREAD_DESTRUCTOR_ITERATIONS
- case _SC_THREAD_DESTRUCTOR_ITERATIONS: return _POSIX_THREAD_DESTRUCTOR_ITERATIONS;
-#endif
- case _SC_THREAD_KEYS_MAX: return SYSTEM_THREAD_KEYS_MAX;
+
+ case _SC_THREAD_DESTRUCTOR_ITERATIONS:
+ return _POSIX_THREAD_DESTRUCTOR_ITERATIONS;
+
+ case _SC_THREAD_KEYS_MAX:
+ return (BIONIC_TLS_SLOTS - TLS_SLOT_FIRST_USER_SLOT);
+
case _SC_THREAD_STACK_MIN: return SYSTEM_THREAD_STACK_MIN;
case _SC_THREAD_THREADS_MAX: return SYSTEM_THREAD_THREADS_MAX;
case _SC_TTY_NAME_MAX: return SYSTEM_TTY_NAME_MAX;