blob: 56c7898a12b4313114b345db2791fa145a51ac89 [file] [log] [blame] [view] [edit]
Project: /youtube/cobalt/_project.yaml
Book: /youtube/cobalt/_book.yaml
# Starboard Module Reference: `thread.h`
Defines functionality related to thread creation and cleanup.
## Macros
### kSbThreadContextInvalid
Well-defined value for an invalid thread context.
### kSbThreadInvalidId
Well-defined constant value to mean "no thread ID."
### kSbThreadLocalKeyInvalid
Well-defined constant value to mean "no thread local key."
### kSbThreadNoAffinity
Well-defined constant value to mean "no affinity."
### kSbThreadSamplerInvalid
Well-defined value for an invalid thread sampler.
## Enums
### SbThreadPriority
A spectrum of thread priorities. Platforms map them appropriately to their own
priority system. Note that scheduling is platform-specific, and what these
priorities mean, if they mean anything at all, is also platform-specific.
In particular, several of these priority values can map to the same priority on
a given platform. The only guarantee is that each lower priority should be
treated less-than-or-equal-to a higher priority.
#### Values
* `kSbThreadPriorityLowest`
The lowest thread priority available on the current platform.
* `kSbThreadPriorityLow`
A lower-than-normal thread priority, if available on the current platform.
* `kSbThreadPriorityNormal`
Really, what is normal? You should spend time pondering that question more
than you consider less-important things, but less than you think about more-
important things.
* `kSbThreadPriorityHigh`
A higher-than-normal thread priority, if available on the current platform.
* `kSbThreadPriorityHighest`
The highest thread priority available on the current platform that isn't
considered "real-time" or "time-critical," if those terms have any meaning
on the current platform.
* `kSbThreadPriorityRealTime`
If the platform provides any kind of real-time or time-critical scheduling,
this priority will request that treatment. Real-time scheduling generally
means that the thread will have more consistency in scheduling than non-
real-time scheduled threads, often by being more deterministic in how
threads run in relation to each other. But exactly how being real-time
affects the thread scheduling is platform-specific.
For platforms where that is not offered, or otherwise not meaningful, this
will just be the highest priority available in the platform's scheme, which
may be the same as kSbThreadPriorityHighest.
* `kSbThreadNoPriority`
Well-defined constant value to mean "no priority." This means to use the
default priority assignment method of that platform. This may mean to
inherit the priority of the spawning thread, or it may mean a specific
default priority, or it may mean something else, depending on the platform.
## Typedefs
### SbThread
An opaque handle to a thread type.
#### Definition
```
typedef void* SbThread
```
### SbThreadAffinity
Type for thread core affinity. This generally will be a single cpu (or core or
hyperthread) identifier. Some platforms may not support affinity, and some may
have specific rules about how it must be used.
#### Definition
```
typedef int32_t SbThreadAffinity
```
### SbThreadContext
A handle to the context of a frozen thread.
#### Definition
```
typedef SbThreadContextPrivate* SbThreadContext
```
### SbThreadEntryPoint
Function pointer type for SbThreadCreate. `context` is a pointer-sized bit of
data passed in from the calling thread.
#### Definition
```
typedef void*(* SbThreadEntryPoint) (void *context)
```
### SbThreadId
An ID type that is unique per thread.
#### Definition
```
typedef int32_t SbThreadId
```
### SbThreadLocalDestructor
Function pointer type for Thread-Local destructors.
#### Definition
```
typedef void(* SbThreadLocalDestructor) (void *value)
```
### SbThreadLocalKey
A handle to a thread-local key.
#### Definition
```
typedef SbThreadLocalKeyPrivate* SbThreadLocalKey
```
### SbThreadSampler
A handle to a thread sampler.
#### Definition
```
typedef SbThreadSamplerPrivate* SbThreadSampler
```
## Functions
### SbThreadContextGetPointer
Gets the specified pointer-type `property` from the specified `context`. Returns
`true` if successful and `out_value` has been modified, otherwise returns
`false` and `out_value` is not modified.
#### Declaration
```
bool SbThreadContextGetPointer(SbThreadContext context, SbThreadContextProperty property, void **out_value)
```
### SbThreadContextIsValid
Returns whether the given thread context is valid.
#### Declaration
```
static bool SbThreadContextIsValid(SbThreadContext context)
```
### SbThreadCreate
Creates a new thread, which starts immediately.
* If the function succeeds, the return value is a handle to the newly created
thread.
* If the function fails, the return value is `kSbThreadInvalid`.
`stack_size`: The amount of memory reserved for the thread. Set the value to `0`
to indicate that the default stack size should be used. `priority`: The thread's
priority. This value can be set to `kSbThreadNoPriority` to use the platform's
default priority. As examples, it could be set to a fixed, standard priority or
to a priority inherited from the thread that is calling SbThreadCreate(), or to
something else. `affinity`: The thread's affinity. This value can be set to
`kSbThreadNoAffinity` to use the platform's default affinity. `joinable`:
Indicates whether the thread can be joined (`true`) or should start out
"detached" (`false`). Note that for joinable threads, when you are done with the
thread handle, you must call `SbThreadJoin` to release system resources
associated with the thread. This is not necessary for detached threads, but
detached threads cannot be joined. `name`: A name used to identify the thread.
This value is used mainly for debugging, it can be `NULL`, and it might not be
used in production builds. `entry_point`: A pointer to a function that will be
executed on the newly created thread. `context`: This value will be passed to
the `entry_point` function.
#### Declaration
```
SbThread SbThreadCreate(int64_t stack_size, SbThreadPriority priority, SbThreadAffinity affinity, bool joinable, const char *name, SbThreadEntryPoint entry_point, void *context)
```
### SbThreadCreateLocalKey
Creates and returns a new, unique key for thread local data. If the function
does not succeed, the function returns `kSbThreadLocalKeyInvalid`.
If `destructor` is specified, it will be called in the owning thread, and only
in the owning thread, when the thread exits. In that case, it is called on the
local value associated with the key in the current thread as long as the local
value is not NULL.
`destructor`: A pointer to a function. The value may be NULL if no clean up is
needed.
#### Declaration
```
SbThreadLocalKey SbThreadCreateLocalKey(SbThreadLocalDestructor destructor)
```
### SbThreadDestroyLocalKey
Destroys thread local data for the specified key. The function is a no-op if the
key is invalid (kSbThreadLocalKeyInvalid`) or has already been destroyed. This
function does NOT call the destructor on any stored values.
`key`: The key for which to destroy thread local data.
#### Declaration
```
void SbThreadDestroyLocalKey(SbThreadLocalKey key)
```
### SbThreadDetach
Detaches `thread`, which prevents it from being joined. This is sort of like a
non-blocking join. This function is a no-op if the thread is already detached or
if the thread is already being joined by another thread.
`thread`: The thread to be detached.
#### Declaration
```
void SbThreadDetach(SbThread thread)
```
### SbThreadGetCurrent
Returns the handle of the currently executing thread.
#### Declaration
```
SbThread SbThreadGetCurrent()
```
### SbThreadGetId
Returns the Thread ID of the currently executing thread.
#### Declaration
```
SbThreadId SbThreadGetId()
```
### SbThreadGetLocalValue
Returns the pointer-sized value for `key` in the currently executing thread's
local storage. Returns `NULL` if key is `kSbThreadLocalKeyInvalid` or if the key
has already been destroyed.
`key`: The key for which to return the value.
#### Declaration
```
void* SbThreadGetLocalValue(SbThreadLocalKey key)
```
### SbThreadGetName
Returns the debug name of the currently executing thread.
#### Declaration
```
void SbThreadGetName(char *buffer, int buffer_size)
```
### SbThreadIsCurrent
Returns whether `thread` is the current thread.
`thread`: The thread to check.
#### Declaration
```
static bool SbThreadIsCurrent(SbThread thread)
```
### SbThreadIsEqual
Indicates whether `thread1` and `thread2` refer to the same thread.
`thread1`: The first thread to compare. `thread2`: The second thread to compare.
#### Declaration
```
bool SbThreadIsEqual(SbThread thread1, SbThread thread2)
```
### SbThreadIsValid
Returns whether the given thread handle is valid.
#### Declaration
```
static bool SbThreadIsValid(SbThread thread)
```
### SbThreadIsValidAffinity
Returns whether the given thread affinity is valid.
#### Declaration
```
static bool SbThreadIsValidAffinity(SbThreadAffinity affinity)
```
### SbThreadIsValidId
Returns whether the given thread ID is valid.
#### Declaration
```
static bool SbThreadIsValidId(SbThreadId id)
```
### SbThreadIsValidLocalKey
Returns whether the given thread local variable key is valid.
#### Declaration
```
static bool SbThreadIsValidLocalKey(SbThreadLocalKey key)
```
### SbThreadIsValidPriority
Returns whether the given thread priority is valid.
#### Declaration
```
static bool SbThreadIsValidPriority(SbThreadPriority priority)
```
### SbThreadJoin
Joins the thread on which this function is called with joinable `thread`. This
function blocks the caller until the designated thread exits, and then cleans up
that thread's resources. The cleanup process essentially detaches thread.
The return value is `true` if the function is successful and `false` if `thread`
is invalid or detached.
Each joinable thread can only be joined once and must be joined to be fully
cleaned up. Once SbThreadJoin is called, the thread behaves as if it were
detached to all threads other than the joining thread.
`thread`: The thread to which the current thread will be joined. The `thread`
must have been created with SbThreadCreate. `out_return`: If this is not `NULL`,
then the SbThreadJoin function populates it with the return value of the
thread's `main` function.
#### Declaration
```
bool SbThreadJoin(SbThread thread, void **out_return)
```
### SbThreadSamplerCreate
Creates a new thread sampler for the specified `thread`.
If successful, this function returns the newly created handle. If unsuccessful,
this function returns `kSbThreadSamplerInvalid`.
#### Declaration
```
SbThreadSampler SbThreadSamplerCreate(SbThread thread)
```
### SbThreadSamplerDestroy
Destroys the `sampler` and frees whatever resources it was using.
#### Declaration
```
void SbThreadSamplerDestroy(SbThreadSampler sampler)
```
### SbThreadSamplerFreeze
Suspends execution of the thread that `sampler` was created for.
If successful, this function returns a `SbThreadContext` for the frozen thread,
from which properties may be read while the thread remains frozen. If
unsuccessful, this function returns `kSbThreadContextInvalid`.
#### Declaration
```
SbThreadContext SbThreadSamplerFreeze(SbThreadSampler sampler)
```
### SbThreadSamplerIsSupported
Whether the current platform supports thread sampling. The result of this
function must not change over the course of the program, which means that the
results of this function may be cached indefinitely. If this returns false,
`SbThreadSamplerCreate` will return an invalid sampler.
#### Declaration
```
bool SbThreadSamplerIsSupported()
```
### SbThreadSamplerIsValid
Returns whether the given thread sampler is valid.
#### Declaration
```
static bool SbThreadSamplerIsValid(SbThreadSampler sampler)
```
### SbThreadSamplerThaw
Resumes execution of the thread that `sampler` was created for. This invalidates
the context returned from `SbThreadSamplerFreeze`.
#### Declaration
```
bool SbThreadSamplerThaw(SbThreadSampler sampler)
```
### SbThreadSetLocalValue
Sets the pointer-sized value for `key` in the currently executing thread's local
storage. The return value indicates whether `key` is valid and has not already
been destroyed.
`key`: The key for which to set the key value. `value`: The new pointer-sized
key value.
#### Declaration
```
bool SbThreadSetLocalValue(SbThreadLocalKey key, void *value)
```
### SbThreadSetName
Sets the debug name of the currently executing thread by copying the specified
name string.
`name`: The name to assign to the thread.
#### Declaration
```
void SbThreadSetName(const char *name)
```
### SbThreadSleep
Sleeps the currently executing thread.
`duration`: The minimum amount of time, in microseconds, that the currently
executing thread should sleep. The function is a no-op if this value is negative
or `0`.
#### Declaration
```
void SbThreadSleep(SbTime duration)
```
### SbThreadYield
Yields the currently executing thread, so another thread has a chance to run.
#### Declaration
```
void SbThreadYield()
```