SDL_systls.c File Reference
`#include "../../SDL_internal.h"`
`#include "SDL_thread.h"`
`#include "../SDL_thread_c.h"`
`#include <pthread.h>`
Include dependency graph for SDL_systls.c:

Go to the source code of this file.

## Macros

#define | INVALID_PTHREAD_KEY ((pthread_key_t)-1)

## Functions

SDL_TLSData * | SDL_SYS_GetTLSData ()
int | SDL_SYS_SetTLSData (SDL_TLSData *data)

## Variables

static pthread_key_t | thread_local_storage = INVALID_PTHREAD_KEY
static SDL_bool | generic_local_storage = SDL_FALSE

## Macro Definition Documentation

#define INVALID_PTHREAD_KEY ((pthread_key_t)-1)

Definition at line 28 of file SDL_systls.c.

Referenced by SDL_SYS_GetTLSData().

## Function Documentation

SDL_TLSData* SDL_SYS_GetTLSData | ( |  | ) |

Definition at line 34 of file SDL_systls.c.

References generic_local_storage, INVALID_PTHREAD_KEY, lock, NULL, SDL_AtomicLock, SDL_AtomicUnlock, SDL_Generic_GetTLSData(), SDL_MemoryBarrierAcquire, SDL_MemoryBarrierRelease, SDL_TRUE, and thread_local_storage.

{
if (thread_local_storage == INVALID_PTHREAD_KEY && !generic_local_storage) {
static SDL_SpinLock lock;
SDL_AtomicLock(&lock);
if (thread_local_storage == INVALID_PTHREAD_KEY && !generic_local_storage) {
pthread_key_t storage;
if (pthread_key_create(&storage, NULL) == 0) {
SDL_MemoryBarrierRelease();
thread_local_storage = storage;
} else {
generic_local_storage = SDL_TRUE;
}
}
SDL_AtomicUnlock(&lock);
}
if (generic_local_storage) {
return SDL_Generic_GetTLSData();
}
SDL_MemoryBarrierAcquire();
return (SDL_TLSData *)pthread_getspecific(thread_local_storage);
}
SDL_AtomicLock
#define SDL_AtomicLock
Definition: SDL_dynapi_overrides.h:70
SDL_Generic_GetTLSData
SDL_TLSData * SDL_Generic_GetTLSData()
Definition: SDL_thread.c:123
SDL_MemoryBarrierRelease
#define SDL_MemoryBarrierRelease()
Definition: SDL_atomic.h:180
SDL_TLSData
Definition: SDL_thread_c.h:69
SDL_MemoryBarrierAcquire
#define SDL_MemoryBarrierAcquire()
Definition: SDL_atomic.h:181
SDL_AtomicUnlock
#define SDL_AtomicUnlock
Definition: SDL_dynapi_overrides.h:71
SDL_TRUE
Definition: SDL_stdinc.h:129
NULL
#define NULL
Definition: begin_code.h:143
thread_local_storage
static pthread_key_t thread_local_storage
Definition: SDL_systls.c:30
lock
SDL_mutex * lock
Definition: SDL_events.c:75
generic_local_storage
static SDL_bool generic_local_storage
Definition: SDL_systls.c:31
SDL_SpinLock
int SDL_SpinLock
Definition: SDL_atomic.h:89
INVALID_PTHREAD_KEY
#define INVALID_PTHREAD_KEY
Definition: SDL_systls.c:28

int SDL_SYS_SetTLSData | ( | SDL_TLSData * | data | ) |

Definition at line 58 of file SDL_systls.c.

References generic_local_storage, SDL_Generic_SetTLSData(), SDL_SetError, and thread_local_storage.

{
if (generic_local_storage) {
return SDL_Generic_SetTLSData(data);
}
if (pthread_setspecific(thread_local_storage, data) != 0) {
return SDL_SetError("pthread_setspecific() failed");
}
return 0;
}
SDL_Generic_SetTLSData
int SDL_Generic_SetTLSData(SDL_TLSData *storage)
Definition: SDL_thread.c:162
SDL_SetError
#define SDL_SetError
Definition: SDL_dynapi_overrides.h:36
thread_local_storage
static pthread_key_t thread_local_storage
Definition: SDL_systls.c:30
generic_local_storage
static SDL_bool generic_local_storage
Definition: SDL_systls.c:31

## Variable Documentation

SDL_bool generic_local_storage = SDL_FALSE

static

Definition at line 31 of file SDL_systls.c.

Referenced by SDL_SYS_GetTLSData(), and SDL_SYS_SetTLSData().

pthread_key_t thread_local_storage = INVALID_PTHREAD_KEY

static

Definition at line 30 of file SDL_systls.c.

Referenced by SDL_SYS_GetTLSData(), and SDL_SYS_SetTLSData().