1 #include "lfds610_freelist_internal.h"
7 /****************************************************************************/
8 int lfds610_freelist_new( struct lfds610_freelist_state **fs, lfds610_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state )
17 // TRD : number_elements can be any value in its range
18 // TRD : user_data_init_function can be NULL
20 *fs = (struct lfds610_freelist_state *) lfds610_liblfds_aligned_malloc( sizeof(struct lfds610_freelist_state), LFDS610_ALIGN_DOUBLE_POINTER );
24 (*fs)->top[LFDS610_FREELIST_POINTER] = NULL;
25 (*fs)->top[LFDS610_FREELIST_COUNTER] = 0;
26 (*fs)->user_data_init_function = user_data_init_function;
27 (*fs)->user_state = user_state;
28 (*fs)->aba_counter = 0;
29 (*fs)->element_count = 0;
31 element_count = lfds610_freelist_new_elements( *fs, number_elements );
33 if( element_count == number_elements )
36 if( element_count != number_elements )
38 lfds610_liblfds_aligned_free( (*fs) );
43 LFDS610_BARRIER_STORE;
52 /****************************************************************************/
53 #pragma warning( disable : 4100 )
55 void lfds610_freelist_use( struct lfds610_freelist_state *fs )
64 #pragma warning( default : 4100 )
70 /****************************************************************************/
71 lfds610_atom_t lfds610_freelist_new_elements( struct lfds610_freelist_state *fs, lfds610_atom_t number_elements )
73 struct lfds610_freelist_element
81 // TRD : number_elements can be any value in its range
82 // TRD : user_data_init_function can be NULL
84 for( loop = 0 ; loop < number_elements ; loop++ )
85 if( lfds610_freelist_internal_new_element(fs, &fe) )
87 lfds610_freelist_push( fs, fe );
98 /****************************************************************************/
99 lfds610_atom_t lfds610_freelist_internal_new_element( struct lfds610_freelist_state *fs, struct lfds610_freelist_element **fe )
104 assert( fs != NULL );
105 assert( fe != NULL );
107 /* TRD : basically, does what you'd expect;
110 calls the user init function
111 if anything fails, cleans up,
116 *fe = (struct lfds610_freelist_element *) lfds610_liblfds_aligned_malloc( sizeof(struct lfds610_freelist_element), LFDS610_ALIGN_DOUBLE_POINTER );
120 if( fs->user_data_init_function == NULL )
122 (*fe)->user_data = NULL;
126 if( fs->user_data_init_function != NULL )
128 rv = fs->user_data_init_function( &(*fe)->user_data, fs->user_state );
132 lfds610_liblfds_aligned_free( *fe );
139 lfds610_abstraction_increment( (lfds610_atom_t *) &fs->element_count );