Merge "Make libcutils' thread local stuff more clearly deprecated." am: 77692aeea2 am: f512b499b8
Original change: https://android-review.googlesource.com/c/platform/system/core/+/1515640 Change-Id: I87a4bc9d4b2076dc63c1a359ca15cc759d2ab5b4
This commit is contained in:
commit
a97067d31a
2 changed files with 17 additions and 70 deletions
|
|
@ -14,8 +14,7 @@
|
||||||
* limitations under the License.
|
* limitations under the License.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifndef _LIBS_CUTILS_THREADS_H
|
#pragma once
|
||||||
#define _LIBS_CUTILS_THREADS_H
|
|
||||||
|
|
||||||
#include <sys/types.h>
|
#include <sys/types.h>
|
||||||
|
|
||||||
|
|
@ -29,16 +28,6 @@
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#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)
|
#if !defined(_WIN32)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
|
|
@ -49,29 +38,24 @@ typedef struct {
|
||||||
|
|
||||||
#define THREAD_STORE_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0 }
|
#define THREAD_STORE_INITIALIZER { PTHREAD_MUTEX_INITIALIZER, 0, 0 }
|
||||||
|
|
||||||
#else // !defined(_WIN32)
|
#endif
|
||||||
|
|
||||||
typedef struct {
|
//
|
||||||
int lock_init;
|
// Deprecated: use android::base::GetThreadId instead, which doesn't truncate on Mac/Windows.
|
||||||
int has_tls;
|
//
|
||||||
DWORD tls;
|
extern pid_t gettid();
|
||||||
CRITICAL_SECTION lock;
|
|
||||||
} thread_store_t;
|
|
||||||
|
|
||||||
#define THREAD_STORE_INITIALIZER { 0, 0, 0, {0, 0, 0, 0, 0, 0} }
|
//
|
||||||
|
// Deprecated: use `_Thread_local` in C or `thread_local` in C++.
|
||||||
#endif // !defined(_WIN32)
|
//
|
||||||
|
#if !defined(_WIN32)
|
||||||
typedef void (*thread_store_destruct_t)(void* value);
|
typedef void (*thread_store_destruct_t)(void* x);
|
||||||
|
extern void* thread_store_get(thread_store_t* x)
|
||||||
extern void* thread_store_get(thread_store_t* store);
|
__attribute__((__deprecated__("use thread_local instead")));
|
||||||
|
extern void thread_store_set(thread_store_t* x, void* y, thread_store_destruct_t z)
|
||||||
extern void thread_store_set(thread_store_t* store,
|
__attribute__((__deprecated__("use thread_local instead")));
|
||||||
void* value,
|
#endif
|
||||||
thread_store_destruct_t destroy);
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#endif /* _LIBS_CUTILS_THREADS_H */
|
|
||||||
|
|
|
||||||
|
|
@ -47,7 +47,6 @@ pid_t gettid() {
|
||||||
#endif // __ANDROID__
|
#endif // __ANDROID__
|
||||||
|
|
||||||
#if !defined(_WIN32)
|
#if !defined(_WIN32)
|
||||||
|
|
||||||
void* thread_store_get( thread_store_t* store )
|
void* thread_store_get( thread_store_t* store )
|
||||||
{
|
{
|
||||||
if (!store->has_tls)
|
if (!store->has_tls)
|
||||||
|
|
@ -72,40 +71,4 @@ extern void thread_store_set( thread_store_t* store,
|
||||||
|
|
||||||
pthread_setspecific( store->tls, value );
|
pthread_setspecific( store->tls, value );
|
||||||
}
|
}
|
||||||
|
#endif
|
||||||
#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) */
|
|
||||||
|
|
|
||||||
Loading…
Add table
Reference in a new issue