Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit f512b499 authored by Treehugger Robot's avatar Treehugger Robot Committed by Automerger Merge Worker
Browse files

Merge "Make libcutils' thread local stuff more clearly deprecated." am: 77692aee

Original change: https://android-review.googlesource.com/c/platform/system/core/+/1515640

Change-Id: I2eaec4711ffb72d9ab34bbe0c2c69eec8ad9a4cc
parents b7ab0c71 77692aee
Loading
Loading
Loading
Loading
+16 −32
Original line number Diff line number Diff line
@@ -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)

typedef struct {
    int               lock_init;
    int               has_tls;
    DWORD             tls;
    CRITICAL_SECTION  lock;
} thread_store_t;

#define  THREAD_STORE_INITIALIZER  { 0, 0, 0, {0, 0, 0, 0, 0, 0} }

#endif // !defined(_WIN32)

typedef void  (*thread_store_destruct_t)(void*  value);
#endif

extern void*  thread_store_get(thread_store_t*  store);
//
// Deprecated: use android::base::GetThreadId instead, which doesn't truncate on Mac/Windows.
//
extern pid_t gettid();

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 */
+1 −38
Original line number Diff line number Diff line
@@ -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