2 #include "lfds710_stack_internal.h"
8 /****************************************************************************/
9 int lfds710_stack_pop( struct lfds710_stack_state *ss,
10 struct lfds710_stack_element **se )
16 backoff_iteration = LFDS710_BACKOFF_INITIAL_VALUE;
18 struct lfds710_stack_element LFDS710_PAL_ALIGN(LFDS710_PAL_ALIGN_DOUBLE_POINTER)
20 *volatile original_top[PAC_SIZE];
22 LFDS710_PAL_ASSERT( ss != NULL );
23 LFDS710_PAL_ASSERT( se != NULL );
25 LFDS710_MISC_BARRIER_LOAD;
27 original_top[COUNTER] = ss->top[COUNTER];
28 original_top[POINTER] = ss->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 LFDS710_PAL_ATOMIC_DWCAS( ss->top, original_top, new_top, LFDS710_MISC_CAS_STRENGTH_WEAK, result );
45 LFDS710_BACKOFF_EXPONENTIAL_BACKOFF( ss->pop_backoff, backoff_iteration );
46 LFDS710_MISC_BARRIER_LOAD;
51 *se = original_top[POINTER];
53 LFDS710_BACKOFF_AUTOTUNE( ss->pop_backoff, backoff_iteration );