1 #include "lfds601_freelist_internal.h"
\r
7 /****************************************************************************/
\r
8 int lfds601_freelist_new( struct lfds601_freelist_state **fs, lfds601_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state )
\r
16 assert( fs != NULL );
\r
17 // TRD : number_elements can be any value in its range
\r
18 // TRD : user_data_init_function can be NULL
\r
20 *fs = (struct lfds601_freelist_state *) lfds601_abstraction_aligned_malloc( sizeof(struct lfds601_freelist_state), LFDS601_ALIGN_DOUBLE_POINTER );
\r
24 (*fs)->top[LFDS601_FREELIST_POINTER] = NULL;
\r
25 (*fs)->top[LFDS601_FREELIST_COUNTER] = 0;
\r
26 (*fs)->user_data_init_function = user_data_init_function;
\r
27 (*fs)->user_state = user_state;
\r
28 (*fs)->aba_counter = 0;
\r
29 (*fs)->element_count = 0;
\r
31 element_count = lfds601_freelist_new_elements( *fs, number_elements );
\r
33 if( element_count == number_elements )
\r
36 if( element_count != number_elements )
\r
38 lfds601_abstraction_aligned_free( (*fs) );
\r
50 /****************************************************************************/
\r
51 lfds601_atom_t lfds601_freelist_new_elements( struct lfds601_freelist_state *fs, lfds601_atom_t number_elements )
\r
53 struct lfds601_freelist_element
\r
60 assert( fs != NULL );
\r
61 // TRD : number_elements can be any value in its range
\r
62 // TRD : user_data_init_function can be NULL
\r
64 for( loop = 0 ; loop < number_elements ; loop++ )
\r
65 if( lfds601_freelist_internal_new_element(fs, &fe) )
\r
67 lfds601_freelist_push( fs, fe );
\r
78 /****************************************************************************/
\r
79 lfds601_atom_t lfds601_freelist_internal_new_element( struct lfds601_freelist_state *fs, struct lfds601_freelist_element **fe )
\r
84 assert( fs != NULL );
\r
85 assert( fe != NULL );
\r
87 /* TRD : basically, does what you'd expect;
\r
89 allocates an element
\r
90 calls the user init function
\r
91 if anything fails, cleans up,
\r
96 *fe = (struct lfds601_freelist_element *) lfds601_abstraction_aligned_malloc( sizeof(struct lfds601_freelist_element), LFDS601_ALIGN_DOUBLE_POINTER );
\r
100 if( fs->user_data_init_function == NULL )
\r
102 (*fe)->user_data = NULL;
\r
106 if( fs->user_data_init_function != NULL )
\r
108 rv = fs->user_data_init_function( &(*fe)->user_data, fs->user_state );
\r
112 lfds601_abstraction_aligned_free( *fe );
\r
119 lfds601_abstraction_increment( (lfds601_atom_t *) &fs->element_count );
\r