]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/src/lfds710_ringbuffer/lfds710_ringbuffer_write.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / src / lfds710_ringbuffer / lfds710_ringbuffer_write.c
1 /***** includes *****/
2 #include "lfds710_ringbuffer_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void lfds710_ringbuffer_write( struct lfds710_ringbuffer_state *rs,
10                                void *key,
11                                void *value,
12                                enum lfds710_misc_flag *overwrite_occurred_flag,
13                                void **overwritten_key,
14                                void **overwritten_value )
15 {
16   int
17     rv = 0;
18
19   struct lfds710_freelist_element
20     *fe;
21
22   struct lfds710_queue_umm_element
23     *qumme;
24
25   struct lfds710_ringbuffer_element
26     *re = NULL;
27
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
35
36   if( overwrite_occurred_flag != NULL )
37     *overwrite_occurred_flag = LFDS710_MISC_FLAG_LOWERED;
38
39   do
40   {
41     rv = lfds710_freelist_pop( &rs->fs, &fe, NULL );
42
43     if( rv == 1 )
44       re = LFDS710_FREELIST_GET_VALUE_FROM_ELEMENT( *fe );
45
46     if( rv == 0 )
47     {
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 );
50
51       if( rv == 1 )
52       {
53         re = LFDS710_QUEUE_UMM_GET_VALUE_FROM_ELEMENT( *qumme );
54         re->qumme_use = (struct lfds710_queue_umm_element *) qumme;
55
56         if( overwrite_occurred_flag != NULL )
57           *overwrite_occurred_flag = LFDS710_MISC_FLAG_RAISED;
58
59         if( overwritten_key != NULL )
60           *overwritten_key = re->key;
61
62         if( overwritten_value != NULL )
63           *overwritten_value = re->value;
64       }
65     }
66   }
67   while( rv == 0 );
68
69   re->key = key;
70   re->value = value;
71
72   LFDS710_QUEUE_UMM_SET_VALUE_IN_ELEMENT( *re->qumme_use, re );
73   lfds710_queue_umm_enqueue( &rs->qumms, re->qumme_use );
74
75   return;
76 }
77