24 #ifndef __RTSKB_FIFO_H_
25 #define __RTSKB_FIFO_H_
31 unsigned long read_pos ____cacheline_aligned_in_smp;
33 unsigned long size_mask;
34 unsigned long write_pos ____cacheline_aligned_in_smp;
36 struct rtskb *buffer[0];
39 #define DECLARE_RTSKB_FIFO(name_prefix, size) \
41 struct rtskb_fifo fifo; \
42 struct rtskb *__buffer[(size)]; \
46 static inline int __rtskb_fifo_insert(
struct rtskb_fifo *fifo,
49 unsigned long pos = fifo->write_pos;
50 unsigned long new_pos = (pos + 1) & fifo->size_mask;
52 if (unlikely(new_pos == fifo->read_pos))
55 fifo->buffer[pos] = rtskb;
60 fifo->write_pos = new_pos;
65 static inline int rtskb_fifo_insert(
struct rtskb_fifo *fifo,
71 rtdm_lock_get_irqsave(&fifo->write_lock, context);
72 result = __rtskb_fifo_insert(fifo, rtskb);
78 static inline int rtskb_fifo_insert_inirq(
struct rtskb_fifo *fifo,
84 result = __rtskb_fifo_insert(fifo, rtskb);
90 static inline struct rtskb *__rtskb_fifo_remove(
struct rtskb_fifo *fifo)
92 unsigned long pos = fifo->read_pos;
96 if (unlikely(pos == fifo->write_pos))
100 result = fifo->buffer[pos];
105 fifo->read_pos = (pos + 1) & fifo->size_mask;
113 static inline struct rtskb *rtskb_fifo_remove(
struct rtskb_fifo *fifo)
116 struct rtskb *result;
118 rtdm_lock_get_irqsave(&fifo->read_lock, context);
119 result = __rtskb_fifo_remove(fifo);
125 static inline struct rtskb *rtskb_fifo_remove_inirq(
struct rtskb_fifo *fifo)
127 struct rtskb *result;
130 result = __rtskb_fifo_remove(fifo);
137 static inline void rtskb_fifo_init(
struct rtskb_fifo *fifo,
142 fifo->size_mask = size - 1;
static void rtdm_lock_put_irqrestore(rtdm_lock_t *lock, rtdm_lockctx_t context)
Release lock and restore preemption state.
Definition: driver.h:603
ipipe_spinlock_t rtdm_lock_t
Lock variable.
Definition: driver.h:528
static void rtdm_lock_put(rtdm_lock_t *lock)
Release lock without preemption restoration.
Definition: driver.h:566
static void rtdm_lock_init(rtdm_lock_t *lock)
Dynamic lock initialisation.
Definition: driver.h:540
unsigned long rtdm_lockctx_t
Variable to save the context while holding a lock.
Definition: driver.h:531
static void rtdm_lock_get(rtdm_lock_t *lock)
Acquire lock from non-preemptible contexts.
Definition: driver.h:552