1 #include "lfds600_stack_internal.h"
7 /****************************************************************************/
8 int lfds600_stack_new( struct lfds600_stack_state **ss, lfds600_atom_t number_elements )
14 // TRD : number_elements can be any value in its range
16 *ss = (struct lfds600_stack_state *) lfds600_abstraction_aligned_malloc( sizeof(struct lfds600_stack_state), LFDS600_ALIGN_DOUBLE_POINTER );
20 // TRD : the size of the lfds600_freelist is the size of the lfds600_stack
21 lfds600_freelist_new( &(*ss)->fs, number_elements, lfds600_stack_internal_freelist_init_function, NULL );
23 if( (*ss)->fs == NULL )
25 lfds600_abstraction_aligned_free( *ss );
29 if( (*ss)->fs != NULL )
31 (*ss)->top[LFDS600_STACK_POINTER] = NULL;
32 (*ss)->top[LFDS600_STACK_COUNTER] = 0;
33 (*ss)->aba_counter = 0;
45 /****************************************************************************/
46 #pragma warning( disable : 4100 )
48 int lfds600_stack_internal_freelist_init_function( void **user_data, void *user_state )
53 assert( user_data != NULL );
54 assert( user_state == NULL );
56 *user_data = lfds600_abstraction_aligned_malloc( sizeof(struct lfds600_stack_element), LFDS600_ALIGN_DOUBLE_POINTER );
58 if( *user_data != NULL )
64 #pragma warning( default : 4100 )
70 /****************************************************************************/
71 void lfds600_stack_internal_new_element_from_freelist( struct lfds600_stack_state *ss, struct lfds600_stack_element *se[LFDS600_STACK_PAC_SIZE], void *user_data )
73 struct lfds600_freelist_element
78 // TRD : user_data can be any value in its range
80 lfds600_freelist_pop( ss->fs, &fe );
83 se[LFDS600_STACK_POINTER] = NULL;
86 lfds600_stack_internal_init_element( ss, se, fe, user_data );
95 /****************************************************************************/
96 void lfds600_stack_internal_new_element( struct lfds600_stack_state *ss, struct lfds600_stack_element *se[LFDS600_STACK_PAC_SIZE], void *user_data )
98 struct lfds600_freelist_element
101 assert( ss != NULL );
102 assert( se != NULL );
103 // TRD : user_data can be any value in its range
105 lfds600_freelist_guaranteed_pop( ss->fs, &fe );
108 se[LFDS600_STACK_POINTER] = NULL;
111 lfds600_stack_internal_init_element( ss, se, fe, user_data );
120 /****************************************************************************/
121 void lfds600_stack_internal_init_element( struct lfds600_stack_state *ss, struct lfds600_stack_element *se[LFDS600_STACK_PAC_SIZE], struct lfds600_freelist_element *fe, void *user_data )
123 assert( ss != NULL );
124 assert( se != NULL );
125 assert( fe != NULL );
126 // TRD : user_data can be any value in its range
128 lfds600_freelist_get_user_data_from_element( fe, (void **) &se[LFDS600_STACK_POINTER] );
130 se[LFDS600_STACK_COUNTER] = (struct lfds600_stack_element *) lfds600_abstraction_increment( (lfds600_atom_t *) &ss->aba_counter );
132 se[LFDS600_STACK_POINTER]->next[LFDS600_STACK_POINTER] = NULL;
133 se[LFDS600_STACK_POINTER]->next[LFDS600_STACK_COUNTER] = 0;
134 se[LFDS600_STACK_POINTER]->fe = fe;
135 se[LFDS600_STACK_POINTER]->user_data = user_data;