2 #include "lfds700_freelist_internal.h"
8 /****************************************************************************/
9 int lfds700_freelist_pop( struct lfds700_freelist_state *fs, struct lfds700_freelist_element **fe, struct lfds700_misc_prng_state *ps )
15 backoff_iteration = LFDS700_MISC_ABSTRACTION_BACKOFF_INITIAL_VALUE;
17 struct lfds700_freelist_element LFDS700_PAL_ALIGN(LFDS700_PAL_ALIGN_DOUBLE_POINTER)
19 *volatile original_top[PAC_SIZE];
21 LFDS700_PAL_ASSERT( fs != NULL );
22 LFDS700_PAL_ASSERT( fe != NULL );
23 LFDS700_PAL_ASSERT( ps != NULL );
25 LFDS700_PAL_BARRIER_PROCESSOR_LOAD;
27 original_top[COUNTER] = fs->top[COUNTER];
28 original_top[POINTER] = fs->top[POINTER];
32 if( original_top[POINTER] == NULL )
38 new_top[COUNTER] = original_top[COUNTER] + 1;
39 new_top[POINTER] = original_top[POINTER]->next;
41 LFDS700_PAL_ATOMIC_DWCAS_WITH_BACKOFF( &fs->top, original_top, new_top, LFDS700_MISC_CAS_STRENGTH_WEAK, result, backoff_iteration, ps );
44 LFDS700_PAL_BARRIER_PROCESSOR_LOAD;
48 *fe = original_top[POINTER];