/* ChibiOS/RT - Copyright (C) 2006,2007,2008,2009,2010, 2011 Giovanni Di Sirio. This file is part of ChibiOS/RT. ChibiOS/RT 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. ChibiOS/RT 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 . */ /** * @file chlists.h * @brief Thread queues/lists macros and structures. * @note All the macros present in this module, while public, are not * an OS API and should not be directly used in the user applications * code. * * @addtogroup internals * @{ */ #ifndef _CHLISTS_H_ #define _CHLISTS_H_ typedef struct Thread Thread; /** * @brief Threads queue initialization. * * @notapi */ #define queue_init(tqp) ((tqp)->p_next = (tqp)->p_prev = (Thread *)(tqp)); /** * @brief Threads list initialization. * * @notapi */ #define list_init(tlp) ((tlp)->p_next = (Thread *)(tlp)) /** * @brief Evaluates to @p TRUE if the specified threads queue or list is * empty. * * @notapi */ #define isempty(p) ((p)->p_next == (Thread *)(p)) /** * @brief Evaluates to @p TRUE if the specified threads queue or list is * not empty. * * @notapi */ #define notempty(p) ((p)->p_next != (Thread *)(p)) /** * @brief Data part of a static threads queue initializer. * @details This macro should be used when statically initializing a threads * queue that is part of a bigger structure. * * @param[in] name the name of the threads queue variable */ #define _THREADSQUEUE_DATA(name) {(Thread *)&name, (Thread *)&name} /** * @brief Static threads queue initializer. * @details Statically initialized threads queues require no explicit * initialization using @p queue_init(). * * @param[in] name the name of the threads queue variable */ #define THREADSQUEUE_DECL(name) ThreadsQueue name = _THREADSQUEUE_DATA(name) /** * @extends ThreadsList * * @brief Generic threads bidirectional linked list header and element. */ typedef struct { Thread *p_next; /**< First @p Thread in the queue, or @p ThreadQueue when empty. */ Thread *p_prev; /**< Last @p Thread in the queue, or @p ThreadQueue when empty. */ } ThreadsQueue; /** * @brief Generic threads single link list, it works like a stack. */ typedef struct { Thread *p_next; /**< Last pushed @p Thread on the stack list, or pointer to itself if empty. */ } ThreadsList; #if !CH_OPTIMIZE_SPEED #ifdef __cplusplus extern "C" { #endif void prio_insert(Thread *tp, ThreadsQueue *tqp); void queue_insert(Thread *tp, ThreadsQueue *tqp); Thread *fifo_remove(ThreadsQueue *tqp); Thread *lifo_remove(ThreadsQueue *tqp); Thread *dequeue(Thread *tp); void list_insert(Thread *tp, ThreadsList *tlp); Thread *list_remove(ThreadsList *tlp); #ifdef __cplusplus } #endif #endif /* !CH_OPTIMIZE_SPEED */ #endif /* _CHLISTS_H_ */ /** @} */ 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138