1 #include "lfds611_stack_internal.h"
\r
7 /****************************************************************************/
\r
8 int lfds611_stack_new( struct lfds611_stack_state **ss, lfds611_atom_t number_elements )
\r
13 assert( ss != NULL );
\r
14 // TRD : number_elements can be any value in its range
\r
16 *ss = (struct lfds611_stack_state *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_stack_state), LFDS611_ALIGN_DOUBLE_POINTER );
\r
20 // TRD : the size of the lfds611_freelist is the size of the lfds611_stack
\r
21 lfds611_freelist_new( &(*ss)->fs, number_elements, lfds611_stack_internal_freelist_init_function, NULL );
\r
23 if( (*ss)->fs == NULL )
\r
25 lfds611_liblfds_aligned_free( *ss );
\r
29 if( (*ss)->fs != NULL )
\r
31 (*ss)->top[LFDS611_STACK_POINTER] = NULL;
\r
32 (*ss)->top[LFDS611_STACK_COUNTER] = 0;
\r
33 (*ss)->aba_counter = 0;
\r
38 LFDS611_BARRIER_STORE;
\r
47 /****************************************************************************/
\r
48 #pragma warning( disable : 4100 )
\r
50 void lfds611_stack_use( struct lfds611_stack_state *ss )
\r
52 assert( ss != NULL );
\r
54 LFDS611_BARRIER_LOAD;
\r
59 #pragma warning( default : 4100 )
\r
65 /****************************************************************************/
\r
66 #pragma warning( disable : 4100 )
\r
68 int lfds611_stack_internal_freelist_init_function( void **user_data, void *user_state )
\r
73 assert( user_data != NULL );
\r
74 assert( user_state == NULL );
\r
76 *user_data = lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_stack_element), LFDS611_ALIGN_DOUBLE_POINTER );
\r
78 if( *user_data != NULL )
\r
84 #pragma warning( default : 4100 )
\r
90 /****************************************************************************/
\r
91 void lfds611_stack_internal_new_element_from_freelist( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], void *user_data )
\r
93 struct lfds611_freelist_element
\r
96 assert( ss != NULL );
\r
97 assert( se != NULL );
\r
98 // TRD : user_data can be any value in its range
\r
100 lfds611_freelist_pop( ss->fs, &fe );
\r
103 se[LFDS611_STACK_POINTER] = NULL;
\r
106 lfds611_stack_internal_init_element( ss, se, fe, user_data );
\r
115 /****************************************************************************/
\r
116 void lfds611_stack_internal_new_element( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], void *user_data )
\r
118 struct lfds611_freelist_element
\r
121 assert( ss != NULL );
\r
122 assert( se != NULL );
\r
123 // TRD : user_data can be any value in its range
\r
125 lfds611_freelist_guaranteed_pop( ss->fs, &fe );
\r
128 se[LFDS611_STACK_POINTER] = NULL;
\r
131 lfds611_stack_internal_init_element( ss, se, fe, user_data );
\r
140 /****************************************************************************/
\r
141 void lfds611_stack_internal_init_element( struct lfds611_stack_state *ss, struct lfds611_stack_element *se[LFDS611_STACK_PAC_SIZE], struct lfds611_freelist_element *fe, void *user_data )
\r
143 assert( ss != NULL );
\r
144 assert( se != NULL );
\r
145 assert( fe != NULL );
\r
146 // TRD : user_data can be any value in its range
\r
148 lfds611_freelist_get_user_data_from_element( fe, (void **) &se[LFDS611_STACK_POINTER] );
\r
150 se[LFDS611_STACK_COUNTER] = (struct lfds611_stack_element *) lfds611_abstraction_increment( (lfds611_atom_t *) &ss->aba_counter );
\r
152 se[LFDS611_STACK_POINTER]->next[LFDS611_STACK_POINTER] = NULL;
\r
153 se[LFDS611_STACK_POINTER]->next[LFDS611_STACK_COUNTER] = 0;
\r
154 se[LFDS611_STACK_POINTER]->fe = fe;
\r
155 se[LFDS611_STACK_POINTER]->user_data = user_data;
\r