void lfds611_liblfds_abstraction_test_helper_increment_atomic( volatile lfds611_atom_t *shared_counter ) { lfds611_atom_t count = 0; assert( shared_counter != NULL ); while( count++ < 10000000 ) lfds611_abstraction_increment( shared_counter ); return; }
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 ) { assert( ss != NULL ); assert( se != NULL ); assert( fe != NULL ); // TRD : user_data can be any value in its range lfds611_freelist_get_user_data_from_element( fe, (void **) &se[LFDS611_STACK_POINTER] ); se[LFDS611_STACK_COUNTER] = (struct lfds611_stack_element *) lfds611_abstraction_increment( (lfds611_atom_t *) &ss->aba_counter ); se[LFDS611_STACK_POINTER]->next[LFDS611_STACK_POINTER] = NULL; se[LFDS611_STACK_POINTER]->next[LFDS611_STACK_COUNTER] = 0; se[LFDS611_STACK_POINTER]->fe = fe; se[LFDS611_STACK_POINTER]->user_data = user_data; return; }
lfds611_atom_t lfds611_freelist_internal_new_element( struct lfds611_freelist_state *fs, struct lfds611_freelist_element **fe ) { lfds611_atom_t rv = 0; assert( fs != NULL ); assert( fe != NULL ); /* TRD : basically, does what you'd expect; allocates an element calls the user init function if anything fails, cleans up, sets *fe to NULL and returns 0 */ *fe = (struct lfds611_freelist_element *) lfds611_liblfds_aligned_malloc( sizeof(struct lfds611_freelist_element), LFDS611_ALIGN_DOUBLE_POINTER ); if( *fe != NULL ) { if( fs->user_data_init_function == NULL ) { (*fe)->user_data = NULL; rv = 1; } if( fs->user_data_init_function != NULL ) { rv = fs->user_data_init_function( &(*fe)->user_data, fs->user_state ); if( rv == 0 ) { lfds611_liblfds_aligned_free( *fe ); *fe = NULL; } } } if( rv == 1 ) lfds611_abstraction_increment( (lfds611_atom_t *) &fs->element_count ); return( rv ); }