Tizen Native API
5.5
|
Abstracts platform threads, providing a uniform API. It's modeled after POSIX THREADS (pthreads), on Linux they are almost 1:1 mapping.
Functions | |
Eina_Thread | eina_thread_self (void) |
Returns identifier of the current thread. | |
Eina_Bool | eina_thread_equal (Eina_Thread t1, Eina_Thread t2) |
Checks if two thread identifiers are the same. | |
Eina_Bool | eina_thread_create (Eina_Thread *t, Eina_Thread_Priority prio, int affinity, Eina_Thread_Cb func, const void *data) |
Creates a new thread, setting its priority and affinity. | |
void * | eina_thread_join (Eina_Thread t) |
Joins a currently running thread, waiting until it finishes. | |
Eina_Bool | eina_thread_name_set (Eina_Thread t, const char *name) |
Sets the name of a given thread for debugging purposes. | |
Eina_Bool | eina_thread_cancel (Eina_Thread t) |
Attempts to cancel a running thread. | |
Eina_Bool | eina_thread_cancellable_set (Eina_Bool cancellable, Eina_Bool *was_cancellable) |
Enables or disables if the current thread can be canceled. | |
void | eina_thread_cancel_checkpoint (void) |
void * | eina_thread_cancellable_run (Eina_Thread_Cancellable_Run_Cb cb, Eina_Free_Cb cleanup_cb, void *data) |
Typedefs | |
typedef uintptr_t | Eina_Thread |
typedef void *(* | Eina_Thread_Cb )(void *data, Eina_Thread t) |
typedef enum _Eina_Thread_Priority | Eina_Thread_Priority |
typedef void *(* | Eina_Thread_Cancellable_Run_Cb )(void *data) |
Defines | |
#define | EINA_THREAD_CLEANUP_PUSH(cleanup, data) pthread_cleanup_push(cleanup, data) |
Pushes a cleanup function to be executed when the thread is canceled. | |
#define | EINA_THREAD_CLEANUP_POP(exec_cleanup) pthread_cleanup_pop(exec_cleanup) |
Pops a cleanup function to be executed when the thread is canceled. |
#define EINA_THREAD_CLEANUP_POP | ( | exec_cleanup | ) | pthread_cleanup_pop(exec_cleanup) |
Pops a cleanup function to be executed when the thread is canceled.
This macro will remove a previously pushed cleanup function, thus if the thread is canceled with eina_thread_cancel() and the thread was previously marked as cancellable with eina_thread_cancellable_set(), that cleanup won't be executed anymore.
It must be paired with EINA_THREAD_CLEANUP_PUSH() in the same code block as they will expand to do {} while ()!
[in] | exec_cleanup | if EINA_TRUE, the function registered with EINA_THREAD_CLEANUP_PUSH() will be executed. |
#define EINA_THREAD_CLEANUP_PUSH | ( | cleanup, | |
data | |||
) | pthread_cleanup_push(cleanup, data) |
Pushes a cleanup function to be executed when the thread is canceled.
This macro will schedule a function cleanup(data) to be executed if the thread is canceled with eina_thread_cancel() and the thread was previously marked as cancellable with eina_thread_cancellable_set().
It must be paired with EINA_THREAD_CLEANUP_POP() in the same code block as they will expand to do {} while ()!
The cleanup function may also be executed if EINA_THREAD_CLEANUP_POP(EINA_TRUE) is used.
[in] | cleanup | The function to execute on cancellation. |
[in] | data | The context to give to cleanup function. |
Type for a generic thread.
Type for the definition of a cancellable callback to run.
Type for the definition of a thread callback function
Type to enumerate different thread priorities
Attempts to cancel a running thread.
This function sends a cancellation request to the thread, however that request is only fulfilled if the thread is cancellable (eina_thread_cancellable_set() with EINA_TRUE as first parameter) and it will wait for a cancellation point, be eina_thread_cancel_checkpoint() or some syscall as defined in man:pthreads(7).
A thread that was canceled will return EINA_THREAD_JOIN_CANCELED when eina_thread_join() is called.
[in] | t | Thread to cancel. |
void eina_thread_cancel_checkpoint | ( | void | ) |
If the current thread is cancellable, this introduces a cancellation check point. Otherwise it's a no-operation.
Eina threads follow pthread_setcanceltype() PTHREAD_CANCEL_DEFERRED, that is, the actual termination will wait for a cancellation point, usually a syscall defined in man:pthreads(7) or an explicit cancellation point defined with this function.
void* eina_thread_cancellable_run | ( | Eina_Thread_Cancellable_Run_Cb | cb, |
Eina_Free_Cb | cleanup_cb, | ||
void * | data | ||
) |
This function will setup cleanup callback, turn the thread cancellable, execute the given callback, reset the cancellable state to its old value, run the cleanup callback and then return the callback return value.
This helper does exactly the following code. Should you need a slightly different behavior, use the base calls yourself.
Eina_Bool old = EINA_FALSE; void *ret; EINA_THREAD_CLEANUP_PUSH(cleanup_cb, data); eina_thread_cancellable_set(EINA_TRUE, &old); // is a cancellation point ret = cb(data); // may not run if was previously canceled EINA_THREAD_CLEANUP_POP(EINA_TRUE); eina_thread_cancellable_set(old, NULL); return ret;
[in] | cb | a cancellable callback to possibly run. The callback may not be executed if the thread had a pending cancellation request. During its execution the callback may be canceled at explicit cancellation points using eina_thread_cancel_checkpoint(), as well as some syscalls defined in man:pthreads(7). |
[in] | cleanup_cb | a cleanup callback to be executed regardless of the thread being canceled or not. This function will be executed even if cb wasn't. |
[in] | data | context to give to both cb and cleanup_cb. |
Eina_Bool eina_thread_cancellable_set | ( | Eina_Bool | cancellable, |
Eina_Bool * | was_cancellable | ||
) |
Enables or disables if the current thread can be canceled.
By default eina_thread_create() will return a thread with cancellation disabled. One can enable the cancellation by using EINA_TRUE in cancellable.
Eina threads follow pthread_setcanceltype() PTHREAD_CANCEL_DEFERRED, that is, the actual termination will wait for a cancellation point, usually a syscall defined in man:pthreads(7) or an explicit cancellation point defined with eina_thread_cancel_checkpoint().
In order to provide cleanup around critical blocks use EINA_THREAD_CLEANUP_PUSH() and EINA_THREAD_CLEANUP_POP() macros (which maps to pthread_cleanup_push() and pthread_cleanup_pop()), or the helper function eina_thread_cancellable_run() which does the pair for you.
[in] | cancellable | If EINA_TRUE, this thread will be accept cancellation requests. If EINA_FALSE -- the default, it will ignore cancellation requests. |
[in] | was_cancellable | If non-NULL, will return the previous state, shall you want to restore. |
Eina_Bool eina_thread_create | ( | Eina_Thread * | t, |
Eina_Thread_Priority | prio, | ||
int | affinity, | ||
Eina_Thread_Cb | func, | ||
const void * | data | ||
) |
Creates a new thread, setting its priority and affinity.
[out] | t | where to return the thread identifier. Must not be NULL . |
[in] | prio | thread priority to use, usually EINA_THREAD_BACKGROUND |
[in] | affinity | thread affinity to use. To not set affinity use -1 . |
[in] | func | function to run in the thread. Must not be NULL . |
[in] | data | context data to provide to func as first argument. |
Eina_Bool eina_thread_equal | ( | Eina_Thread | t1, |
Eina_Thread | t2 | ||
) |
Checks if two thread identifiers are the same.
[in] | t1 | first thread identifier to compare. |
[in] | t2 | second thread identifier to compare. |
void* eina_thread_join | ( | Eina_Thread | t | ) |
Joins a currently running thread, waiting until it finishes.
This function will block the current thread until t finishes. The returned value is the one returned by t func()
and may be NULL
on errors. See Error to identify problems.
[in] | t | thread identifier to wait. |
func()
or NULL
on errors. Check error with Error. If the thread was canceled, it will return EINA_THREAD_JOIN_CANCELED. Eina_Bool eina_thread_name_set | ( | Eina_Thread | t, |
const char * | name | ||
) |
Sets the name of a given thread for debugging purposes.
This maps to the pthread_setname_np() GNU extension or similar if available. The name may be limited in size (possibly 16 characters including the null byte terminator). This is useful for debugging to name a thread so external tools can display a meaningful name attached to the thread.
[in] | t | thread to set the name of |
[in] | name | a string to name the thread - this cannot be NULL |
Eina_Thread eina_thread_self | ( | void | ) |
Returns identifier of the current thread.
const void* EINA_THREAD_JOIN_CANCELED |
The return value of eina_thread_join() if it was canceled with eina_thread_cancel().
A thread must be explicitly flagged as cancellable with eina_thread_cancellable_set(), by default it's not and this value shouldn't be returned.