// Copyright (c) rAthena Project (www.rathena.org) - Licensed under GNU GPL // For more information, see LICENCE in the main folder #ifndef COMMON_THREAD_H #define COMMON_THREAD_H #include "common/cbasetypes.h" typedef struct rAthread rAthread; typedef void* (*rAthreadProc)(void*); typedef enum RATHREAD_PRIO { RAT_PRIO_LOW = 0, RAT_PRIO_NORMAL, RAT_PRIO_HIGH } RATHREAD_PRIO; #ifdef HERCULES_CORE /** * Creates a new Thread * * @param entyPoint - entryProc, * @param param - general purpose parameter, would be given as parameter to the thread's entry point. * * @return not NULL if success */ rAthread *rathread_create(rAthreadProc entryPoint, void *param); /** * Creates a new Thread (with more creation options) * * @param entyPoint - entryProc, * @param param - general purpose parameter, would be given as parameter to the thread's entry point * @param szStack - stack Size in bytes * @param prio - Priority of the Thread @ OS Scheduler.. * * @return not NULL if success */ rAthread *rathread_createEx(rAthreadProc entryPoint, void *param, size_t szStack, RATHREAD_PRIO prio); /** * Destroys the given Thread immediately * * @note The Handle gets invalid after call! don't use it afterwards. * * @param handle - thread to destroy. */ void rathread_destroy(rAthread *handle); /** * Returns the thread handle of the thread calling this function * * @note this wont work @ programs main thread * @note the underlying implementation might not perform very well, cache the value received! * * @return not NULL if success */ rAthread *rathread_self(void); /** * Returns own thread id (TID) * * @note this is an unique identifier for the calling thread, and * depends on platform/ compiler, and may not be the systems Thread ID! * * @return -1 when fails, otherwise >= 0 */ int rathread_get_tid(void); /** * Waits for the given thread to terminate * * @param handle - thread to wait (join) for * @param out_Exitcode - [OPTIONAL] - if given => Exitcode (value) of the given thread - if it's terminated * * @return true - if the given thread has been terminated. */ bool rathread_wait(rAthread *handle, void **out_exitCode); /** * Sets the given PRIORITY @ OS Task Scheduler * * @param handle - thread to set prio for * @param rio - the priority (RAT_PRIO_LOW ... ) */ void rathread_prio_set(rAthread *handle, RATHREAD_PRIO prio); /** * Gets the current Prio of the given thread * * @param handle - the thread to get the prio for. */ RATHREAD_PRIO rathread_prio_get(rAthread *handle); /** * Tells the OS scheduler to yield the execution of the calling thread * * @note: this will not "pause" the thread, * it just allows the OS to spend the remaining time * of the slice to another thread. */ void rathread_yield(void); void rathread_init(void); void rathread_final(void); #endif // HERCULES_CORE #endif /* COMMON_THREAD_H */