1 #include "lfds600_freelist_internal.h"
7 /****************************************************************************/
8 int lfds600_freelist_new( struct lfds600_freelist_state **fs, lfds600_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 lfds600_freelist_state *) lfds600_abstraction_aligned_malloc( sizeof(struct lfds600_freelist_state), LFDS600_ALIGN_DOUBLE_POINTER );
24 (*fs)->top[LFDS600_FREELIST_POINTER] = NULL;
25 (*fs)->top[LFDS600_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 = lfds600_freelist_new_elements( *fs, number_elements );
33 if( element_count == number_elements )
36 if( element_count != number_elements )
38 lfds600_abstraction_aligned_free( (*fs) );
50 /****************************************************************************/
51 lfds600_atom_t lfds600_freelist_new_elements( struct lfds600_freelist_state *fs, lfds600_atom_t number_elements )
53 struct lfds600_freelist_element
61 // TRD : number_elements can be any value in its range
62 // TRD : user_data_init_function can be NULL
64 for( loop = 0 ; loop < number_elements ; loop++ )
65 if( lfds600_freelist_internal_new_element(fs, &fe) )
67 lfds600_freelist_push( fs, fe );
78 /****************************************************************************/
79 lfds600_atom_t lfds600_freelist_internal_new_element( struct lfds600_freelist_state *fs, struct lfds600_freelist_element **fe )
87 /* TRD : basically, does what you'd expect;
90 calls the user init function
91 if anything fails, cleans up,
96 *fe = (struct lfds600_freelist_element *) lfds600_abstraction_aligned_malloc( sizeof(struct lfds600_freelist_element), LFDS600_ALIGN_DOUBLE_POINTER );
100 if( fs->user_data_init_function == NULL )
102 (*fe)->user_data = NULL;
106 if( fs->user_data_init_function != NULL )
108 rv = fs->user_data_init_function( &(*fe)->user_data, fs->user_state );
112 lfds600_abstraction_aligned_free( *fe );
119 lfds600_abstraction_increment( (lfds600_atom_t *) &fs->element_count );