2 #include "lfds710_ringbuffer_internal.h"
8 /****************************************************************************/
9 void lfds710_ringbuffer_write( struct lfds710_ringbuffer_state *rs,
12 enum lfds710_misc_flag *overwrite_occurred_flag,
13 void **overwritten_key,
14 void **overwritten_value )
19 struct lfds710_freelist_element
22 struct lfds710_queue_umm_element
25 struct lfds710_ringbuffer_element
28 LFDS710_PAL_ASSERT( rs != NULL );
29 // TRD : key can be NULL
30 // TRD : value can be NULL
31 // TRD : overwrite_occurred_flag can be NULL
32 // TRD : overwritten_key can be NULL
33 // TRD : overwritten_value can be NULL
34 // TRD : psts can be NULL
36 if( overwrite_occurred_flag != NULL )
37 *overwrite_occurred_flag = LFDS710_MISC_FLAG_LOWERED;
41 rv = lfds710_freelist_pop( &rs->fs, &fe, NULL );
44 re = LFDS710_FREELIST_GET_VALUE_FROM_ELEMENT( *fe );
48 // TRD : the queue can return empty as well - remember, we're lock-free; anything could have happened since the previous instruction
49 rv = lfds710_queue_umm_dequeue( &rs->qumms, &qumme );
53 re = LFDS710_QUEUE_UMM_GET_VALUE_FROM_ELEMENT( *qumme );
54 re->qumme_use = (struct lfds710_queue_umm_element *) qumme;
56 if( overwrite_occurred_flag != NULL )
57 *overwrite_occurred_flag = LFDS710_MISC_FLAG_RAISED;
59 if( overwritten_key != NULL )
60 *overwritten_key = re->key;
62 if( overwritten_value != NULL )
63 *overwritten_value = re->value;
72 LFDS710_QUEUE_UMM_SET_VALUE_IN_ELEMENT( *re->qumme_use, re );
73 lfds710_queue_umm_enqueue( &rs->qumms, re->qumme_use );