2 #include "lfds700_ringbuffer_internal.h"
8 /****************************************************************************/
9 void lfds700_ringbuffer_write( struct lfds700_ringbuffer_state *rs,
12 enum lfds700_misc_flag *overwrite_occurred_flag,
13 void **overwritten_key,
14 void **overwritten_value,
15 struct lfds700_misc_prng_state *ps )
20 struct lfds700_freelist_element
23 struct lfds700_queue_element
26 struct lfds700_ringbuffer_element
29 LFDS700_PAL_ASSERT( rs != NULL );
30 // TRD : key can be NULL
31 // TRD : value can be NULL
32 // TRD : overwrite_occurred_flag can be NULL
33 // TRD : overwritten_key can be NULL
34 // TRD : overwritten_value can be NULL
35 LFDS700_PAL_ASSERT( ps != NULL );
37 if( overwrite_occurred_flag != NULL )
38 *overwrite_occurred_flag = LFDS700_MISC_FLAG_LOWERED;
42 rv = lfds700_freelist_pop( &rs->fs, &fe, ps );
45 re = LFDS700_FREELIST_GET_VALUE_FROM_ELEMENT( *fe );
49 // TRD : the queue can return empty as well - remember, we're lock-free; anything could have happened since the previous instruction
50 rv = lfds700_queue_dequeue( &rs->qs, &qe, ps );
54 re = LFDS700_QUEUE_GET_VALUE_FROM_ELEMENT( *qe );
55 re->qe_use = (struct lfds700_queue_element *) qe;
57 if( overwrite_occurred_flag != NULL )
58 *overwrite_occurred_flag = LFDS700_MISC_FLAG_RAISED;
60 if( overwritten_key != NULL )
61 *overwritten_key = re->key;
63 if( overwritten_value != NULL )
64 *overwritten_value = re->value;
73 LFDS700_QUEUE_SET_VALUE_IN_ELEMENT( *re->qe_use, re );
74 lfds700_queue_enqueue( &rs->qs, re->qe_use, ps );