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

Commit 0675702c authored by Elliott Hughes's avatar Elliott Hughes
Browse files

Make libcutils' thread local stuff more clearly deprecated.

libcutils' thread local stuff is almost unused already, so let's try
harder to prevent new users. (In parallel I'll try to actually move the
four existing users off it, so we can actually remove this.)

Test: treehugger
Change-Id: Ib5445a43cff1f161ce1c7a45959d5b126f6f6980
parent 41c2e628
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