Merge "Make libcutils' thread local stuff more clearly deprecated."

This commit is contained in:
Treehugger Robot 2020-12-07 17:58:30 +00:00 committed by Gerrit Code Review
commit 77692aeea2
2 changed files with 17 additions and 70 deletions

View file

@ -14,8 +14,7 @@
* limitations under the License.
*/
#ifndef _LIBS_CUTILS_THREADS_H
#define _LIBS_CUTILS_THREADS_H
#pragma once
#include <sys/types.h>
@ -29,16 +28,6 @@
extern "C" {
#endif
//
// Deprecated: use android::base::GetThreadId instead, which doesn't truncate on Mac/Windows.
//
extern pid_t gettid();
//
// Deprecated: use `_Thread_local` in C or `thread_local` in C++.
//
#if !defined(_WIN32)
typedef struct {
@ -49,29 +38,24 @@ typedef struct {
#define THREAD_STORE_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0 }
#else // !defined(_WIN32)
#endif
typedef struct {
int lock_init;
int has_tls;
DWORD tls;
CRITICAL_SECTION lock;
} thread_store_t;
//
// Deprecated: use android::base::GetThreadId instead, which doesn't truncate on Mac/Windows.
//
extern pid_t gettid();
#define THREAD_STORE_INITIALIZER { 0, 0, 0, {0, 0, 0, 0, 0, 0} }
#endif // !defined(_WIN32)
typedef void (*thread_store_destruct_t)(void* value);
extern void* thread_store_get(thread_store_t* store);
extern void thread_store_set(thread_store_t* store,
void* value,
thread_store_destruct_t destroy);
//
// Deprecated: use `_Thread_local` in C or `thread_local` in C++.
//
#if !defined(_WIN32)
typedef void (*thread_store_destruct_t)(void* x);
extern void* thread_store_get(thread_store_t* x)
__attribute__((__deprecated__("use thread_local instead")));
extern void thread_store_set(thread_store_t* x, void* y, thread_store_destruct_t z)
__attribute__((__deprecated__("use thread_local instead")));
#endif
#ifdef __cplusplus
}
#endif
#endif /* _LIBS_CUTILS_THREADS_H */

View file

@ -47,7 +47,6 @@ pid_t gettid() {
#endif // __ANDROID__
#if !defined(_WIN32)
void* thread_store_get( thread_store_t* store )
{
if (!store->has_tls)
@ -72,40 +71,4 @@ extern void thread_store_set( thread_store_t* store,
pthread_setspecific( store->tls, value );
}
#else /* !defined(_WIN32) */
void* thread_store_get( thread_store_t* store )
{
if (!store->has_tls)
return NULL;
return (void*) TlsGetValue( store->tls );
}
void thread_store_set( thread_store_t* store,
void* value,
thread_store_destruct_t /*destroy*/ )
{
/* XXX: can't use destructor on thread exit */
if (!store->lock_init) {
store->lock_init = -1;
InitializeCriticalSection( &store->lock );
store->lock_init = -2;
} else while (store->lock_init != -2) {
Sleep(10); /* 10ms */
}
EnterCriticalSection( &store->lock );
if (!store->has_tls) {
store->tls = TlsAlloc();
if (store->tls == TLS_OUT_OF_INDEXES) {
LeaveCriticalSection( &store->lock );
return;
}
store->has_tls = 1;
}
LeaveCriticalSection( &store->lock );
TlsSetValue( store->tls, value );
}
#endif /* !defined(_WIN32) */
#endif