1 #include "lfds610_queue_internal.h"
7 /****************************************************************************/
8 int lfds610_queue_new( struct lfds610_queue_state **qs, lfds610_atom_t number_elements )
13 struct lfds610_queue_element
14 *qe[LFDS610_QUEUE_PAC_SIZE];
17 // TRD : number_elements can be any value in its range
19 *qs = (struct lfds610_queue_state *) lfds610_liblfds_aligned_malloc( sizeof(struct lfds610_queue_state), LFDS610_ALIGN_DOUBLE_POINTER );
23 // TRD : the size of the lfds610_freelist is the size of the lfds610_queue (+1 for the leading dummy element, which is hidden from the caller)
24 lfds610_freelist_new( &(*qs)->fs, number_elements+1, lfds610_queue_internal_freelist_init_function, NULL );
26 if( (*qs)->fs != NULL )
28 lfds610_queue_internal_new_element_from_freelist( *qs, qe, NULL );
29 (*qs)->enqueue[LFDS610_QUEUE_POINTER] = (*qs)->dequeue[LFDS610_QUEUE_POINTER] = qe[LFDS610_QUEUE_POINTER];
30 (*qs)->enqueue[LFDS610_QUEUE_COUNTER] = (*qs)->dequeue[LFDS610_QUEUE_COUNTER] = 0;
31 (*qs)->aba_counter = 0;
35 if( (*qs)->fs == NULL )
37 lfds610_liblfds_aligned_free( *qs );
42 LFDS610_BARRIER_STORE;
51 /****************************************************************************/
52 #pragma warning( disable : 4100 )
54 void lfds610_queue_use( struct lfds610_queue_state *qs )
63 #pragma warning( default : 4100 )
69 /****************************************************************************/
70 #pragma warning( disable : 4100 )
72 int lfds610_queue_internal_freelist_init_function( void **user_data, void *user_state )
77 assert( user_data != NULL );
78 assert( user_state == NULL );
80 *user_data = lfds610_liblfds_aligned_malloc( sizeof(struct lfds610_queue_element), LFDS610_ALIGN_DOUBLE_POINTER );
82 if( *user_data != NULL )
88 #pragma warning( default : 4100 )
94 /****************************************************************************/
95 void lfds610_queue_internal_new_element_from_freelist( struct lfds610_queue_state *qs, struct lfds610_queue_element *qe[LFDS610_QUEUE_PAC_SIZE], void *user_data )
97 struct lfds610_freelist_element
100 assert( qs != NULL );
101 assert( qe != NULL );
102 // TRD : user_data can be any value in its range
104 qe[LFDS610_QUEUE_POINTER] = NULL;
106 lfds610_freelist_pop( qs->fs, &fe );
109 lfds610_queue_internal_init_element( qs, qe, fe, user_data );
118 /****************************************************************************/
119 void lfds610_queue_internal_guaranteed_new_element_from_freelist( struct lfds610_queue_state *qs, struct lfds610_queue_element *qe[LFDS610_QUEUE_PAC_SIZE], void *user_data )
121 struct lfds610_freelist_element
124 assert( qs != NULL );
125 assert( qe != NULL );
126 // TRD : user_data can be any value in its range
128 qe[LFDS610_QUEUE_POINTER] = NULL;
130 lfds610_freelist_guaranteed_pop( qs->fs, &fe );
133 lfds610_queue_internal_init_element( qs, qe, fe, user_data );
142 /****************************************************************************/
143 void lfds610_queue_internal_init_element( struct lfds610_queue_state *qs, struct lfds610_queue_element *qe[LFDS610_QUEUE_PAC_SIZE], struct lfds610_freelist_element *fe, void *user_data )
145 assert( qs != NULL );
146 assert( qe != NULL );
147 assert( fe != NULL );
148 // TRD : user_data can be any value in its range
150 lfds610_freelist_get_user_data_from_element( fe, (void **) &qe[LFDS610_QUEUE_POINTER] );
151 qe[LFDS610_QUEUE_COUNTER] = (struct lfds610_queue_element *) lfds610_abstraction_increment( (lfds610_atom_t *) &qs->aba_counter );
153 qe[LFDS610_QUEUE_POINTER]->next[LFDS610_QUEUE_POINTER] = NULL;
154 qe[LFDS610_QUEUE_POINTER]->next[LFDS610_QUEUE_COUNTER] = (struct lfds610_queue_element *) lfds610_abstraction_increment( (lfds610_atom_t *) &qs->aba_counter );
156 qe[LFDS610_QUEUE_POINTER]->fe = fe;
157 qe[LFDS610_QUEUE_POINTER]->user_data = user_data;