00001
00038 #ifndef RING_H_INCLUDED
00039 #define RING_H_INCLUDED
00040
00041 #include <stdbool.h>
00042
00103 struct ring_head {
00105 unsigned int head;
00107 unsigned int tail;
00108 };
00109
00110 #ifdef CONFIG_RING_DEBUG
00111 #include <util.h>
00112
00113 ERROR_FUNC(ring_priv_bad_constant_size, "Ring size must be a power of two")
00114
00115 static inline void ring_priv_bad_size(unsigned int size)
00116 {
00117 dbg_error("Bad ring size %u: Not a power of two!\n", size);
00118 }
00119
00120 static inline void ring_priv_check_size(unsigned int size)
00121 {
00122 if (!is_power_of_two(size)) {
00123 if (is_constant(size))
00124 ring_priv_bad_constant_size(size);
00125 else
00126 ring_priv_bad_size(size);
00127 }
00128 }
00129 #else
00130 static inline void ring_priv_check_size(unsigned int size)
00131 {
00132
00133 }
00134 #endif
00135
00147 static inline unsigned long ring_get_head(struct ring_head *ring,
00148 unsigned int ring_size)
00149 {
00150 ring_priv_check_size(ring_size);
00151
00152 return ring->head & (ring_size - 1);
00153 }
00154
00166 static inline unsigned long ring_get_tail(struct ring_head *ring,
00167 unsigned int ring_size)
00168 {
00169 ring_priv_check_size(ring_size);
00170
00171 return ring->tail & (ring_size - 1);
00172 }
00173
00182 static inline unsigned int ring_entries_used(struct ring_head *ring)
00183 {
00184 return ring->head - ring->tail;
00185 }
00186
00196 static inline unsigned int ring_entries_used_before_end(struct ring_head *ring,
00197 unsigned int ring_size)
00198 {
00199 unsigned int head = ring->head;
00200 unsigned int tail = ring->tail;
00201
00202 ring_priv_check_size(ring_size);
00203
00204 if ((head ^ tail) & ring_size)
00205 return ring_size - (tail & (ring_size - 1));
00206 else
00207 return head - tail;
00208 }
00209
00219 static inline unsigned int ring_entries_unused(struct ring_head *ring,
00220 unsigned int ring_size)
00221 {
00222 return ring_size - ring_entries_used(ring);
00223 }
00224
00235 static inline unsigned int ring_entries_unused_before_end(
00236 struct ring_head *ring, unsigned int ring_size)
00237 {
00238 unsigned int head = ring->head;
00239 unsigned int tail = ring->tail;
00240
00241 ring_priv_check_size(ring_size);
00242
00243 if ((head ^ tail) & ring_size)
00244 return ring_size + tail - head;
00245 else
00246 return ring_size - (head & (ring_size - 1));
00247 }
00248
00257 static inline bool ring_is_empty(struct ring_head *ring)
00258 {
00259 return ring->head == ring->tail;
00260 }
00261
00271 static inline bool ring_is_full(struct ring_head *ring,
00272 unsigned int ring_size)
00273 {
00274 return ring_entries_used(ring) == ring_size;
00275 }
00276
00288 static inline void ring_insert_entries(struct ring_head *ring,
00289 unsigned int nr_entries)
00290 {
00291 barrier();
00292 ring->head += nr_entries;
00293 }
00294
00306 static inline void ring_extract_entries(struct ring_head *ring,
00307 unsigned int nr_entries)
00308 {
00309 barrier();
00310 ring->tail += nr_entries;
00311 }
00312
00321 static inline void ring_reset(struct ring_head *ring)
00322 {
00323 ring->head = ring->tail = 0;
00324 }
00325
00327
00328 #endif