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 );
}