diff --git a/core/include/thread_flags.h b/core/include/thread_flags.h index e87538eb1c71de9f1997f6bf5f7ad5472a6541c8..cfe0ce3d044c490916ba0fb524f5c7b5f5d22592 100644 --- a/core/include/thread_flags.h +++ b/core/include/thread_flags.h @@ -7,12 +7,9 @@ */ /** - * @ingroup core_thread + * @defgroup core_thread_flags Thread Flags + * @ingroup core * @brief Thread flags - * @{ - * - * @file - * @brief Thread flags API * * This API can be used to notify threads of conditions in a race-free * and allocation-less way. @@ -45,11 +42,22 @@ * Note that some flags (currently the three most significant bits) are used by * core functions and should not be set by the user. They can be waited for. * + * This API is optional and must be enabled by adding "core_thread_flags" to USEMODULE. + * + * @{ + * + * @file + * @brief Thread Flags API + * * @author Kaspar Schleiser <kaspar@schleiser.de> */ #ifndef THREAD_FLAGS_H #define THREAD_FLAGS_H +#ifndef MODULE_CORE_THREAD_FLAGS +#error Missing USEMODULE += core_thread_flags +#endif + #include "kernel_types.h" #include "sched.h" /* for thread_t typedef */ @@ -61,13 +69,41 @@ * @name reserved thread flags * @{ */ + +/** + * @brief Set when a message becomes available + * + * This flag is set for a thread if a message becomes available either by being + * queued in the thread's message queue or by another thread becoming + * send-blocked. + * + * It is only reset through thread_flags_wait_*(), not by msg_receive(). + * + * One thread flag event might point to one, many or no messages ready to be + * received. It is advisable to use the non-blocking @ref msg_try_receive() in + * a loop to retrieve the messages. + * Use e.g., the following pattern when waiting for both thread flags and + * messages: + * + * while(1) { + * thread_flags_t flags = thread_flags_wait_any(0xFFFF); + * if (flags & THREAD_FLAG_MSG_WAITING) { + * msg_t msg; + * while (msg_try_receive(&msg) == 1) { + * [ handle msg ] + * } + * } + * ... + * } + */ #define THREAD_FLAG_MSG_WAITING (0x1<<15) + #define THREAD_FLAG_MUTEX_UNLOCKED (0x1<<14) #define THREAD_FLAG_TIMEOUT (0x1<<13) /** @} */ /** - * @name Define type of thread_flags_t + * @brief Type definition of thread_flags_t */ typedef uint16_t thread_flags_t; @@ -151,5 +187,5 @@ int thread_flags_wake(thread_t *thread); } #endif -/** @} */ #endif /* THREAD_FLAGS_H */ +/** @} */