/** * This file is part of Hercules. * http://herc.ws - http://github.com/HerculesWS/Hercules * * Copyright (C) 2012-2018 Hercules Dev Team * Copyright (C) rAthena Project (www.rathena.org) * * Hercules is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see . */ #ifndef COMMON_THREAD_H #define COMMON_THREAD_H #include "common/hercules.h" /** @file * Basic Threading abstraction (for pthread / win32 based systems). */ /* Opaque Types */ struct thread_handle; ///< Thread handle. typedef void *(*threadFunc)(void *); ///< Thread entry point function. /* Enums */ /// Thread priority enum thread_priority { THREADPRIO_LOW = 0, THREADPRIO_NORMAL, THREADPRIO_HIGH }; /// The thread interface struct thread_interface { /// Interface initialization. void (*init) (void); /// Interface finalization. void (*final) (void); /** * Creates a new Thread. * * @param enty_point Thread's entry point. * @param param General purpose parameter, would be given as * parameter to the thread's entry point. * * @return The created thread object. * @retval NULL in vase of failure. */ struct thread_handle *(*create) (threadFunc entry_point, void *param); /** * Creates a new Thread (with more creation options). * * @param enty_point Thread's entry point. * @param param General purpose parameter, would be given as * parameter to the thread's entry point. * @param stack_size Stack Size in bytes. * @param prio Priority of the Thread in the OS scheduler. * * @return The created thread object. * @retval NULL in case of failure. */ struct thread_handle *(*create_opt) (threadFunc entry_point, void *param, size_t stack_size, enum thread_priority prio); /** * Destroys the given Thread immediately. * * @remark * The Handle gets invalid after call! don't use it afterwards. * * @param handle The thread to destroy. */ void (*destroy) (struct thread_handle *handle); /** * Returns the thread handle of the thread calling this function. * * @remark * This won't work in the program's main thread. * * @warning * The underlying implementation might not perform very well, cache * the value received! * * @return the thread handle. * @retval NULL in case of failure. */ struct thread_handle *(*self) (void); /** * Returns own thread id (TID). * * @remark * This is an unique identifier for the calling thread, and depends * on platform/ compiler, and may not be the systems Thread ID! * * @return the thread ID. * @retval -1 in case of failure. */ int (*get_tid) (void); /** * Waits for the given thread to terminate. * * @param[in] handle The thread to wait (join) for. * @param[out] out_exit_code Pointer to return the exit code of the * given thread after termination (optional). * * @retval true if the given thread has been terminated. */ bool (*wait) (struct thread_handle *handle, void **out_exit_code); /** * Sets the given priority in the OS scheduler. * * @param handle The thread to set the priority for. * @param prio The priority to set (@see enum thread_priority). */ void (*prio_set) (struct thread_handle *handle, enum thread_priority prio); /** * Gets the current priority of the given thread. * * @param handle The thread to get the priority for. */ enum thread_priority (*prio_get) (struct thread_handle *handle); /** * Tells the OS scheduler to yield the execution of the calling thread. * * @remark * This will not "pause" the thread, it just allows the OS to spend * the remaining time of the slice to another thread. */ void (*yield) (void); }; #ifdef HERCULES_CORE void thread_defaults(void); #endif // HERCULES_CORE HPShared struct thread_interface *thread; ///< Pointer to the thread interface. #endif /* COMMON_THREAD_H */