1 #include "lfds611_ringbuffer_internal.h"
\r
7 /****************************************************************************/
\r
8 struct lfds611_freelist_element *lfds611_ringbuffer_get_read_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element **fe )
\r
10 assert( rs != NULL );
\r
11 assert( fe != NULL );
\r
13 lfds611_queue_dequeue( rs->qs, (void **) fe );
\r
22 /****************************************************************************/
\r
23 struct lfds611_freelist_element *lfds611_ringbuffer_get_write_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element **fe, int *overwrite_flag )
\r
25 assert( rs != NULL );
\r
26 assert( fe != NULL );
\r
27 // TRD : overwrite_flag can be NULL
\r
29 /* TRD : we try to obtain an element from the lfds611_freelist
\r
30 if we can, we populate it and add it to the lfds611_queue
\r
32 if we cannot, then the lfds611_ringbuffer is full
\r
33 so instead we grab the current read element and
\r
36 dequeue may fail since the lfds611_queue may be emptied
\r
37 during our dequeue attempt
\r
39 so what we actually do here is a loop, attempting
\r
40 the lfds611_freelist and if it fails then a dequeue, until
\r
41 we obtain an element
\r
43 once we have an element, we lfds611_queue it
\r
45 you may be wondering why this operation is in a loop
\r
46 remember - these operations are lock-free; anything
\r
47 can happen in between
\r
49 so for example the pop could fail because the lfds611_freelist
\r
50 is empty; but by the time we go to get an element from
\r
51 the lfds611_queue, the whole lfds611_queue has been emptied back into
\r
52 the lfds611_freelist!
\r
54 if overwrite_flag is provided, we set it to 0 if we
\r
55 obtained a new element from the lfds611_freelist, 1 if we
\r
56 stole an element from the lfds611_queue
\r
61 if( overwrite_flag != NULL )
\r
62 *overwrite_flag = 0;
\r
64 lfds611_freelist_pop( rs->fs, fe );
\r
68 lfds611_ringbuffer_get_read_element( rs, fe );
\r
70 if( overwrite_flag != NULL and *fe != NULL )
\r
71 *overwrite_flag = 1;
\r
74 while( *fe == NULL );
\r
83 /****************************************************************************/
\r
84 void lfds611_ringbuffer_put_read_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element *fe )
\r
86 assert( rs != NULL );
\r
87 assert( fe != NULL );
\r
89 lfds611_freelist_push( rs->fs, fe );
\r
98 /****************************************************************************/
\r
99 void lfds611_ringbuffer_put_write_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element *fe )
\r
101 assert( rs != NULL );
\r
102 assert( fe != NULL );
\r
104 lfds611_queue_enqueue( rs->qs, fe );
\r