2 #include "lfds710_stack_internal.h"
8 /****************************************************************************/
9 void lfds710_stack_push( 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 new_top[POINTER] = se;
27 original_top[COUNTER] = ss->top[COUNTER];
28 original_top[POINTER] = ss->top[POINTER];
32 se->next = original_top[POINTER];
33 LFDS710_MISC_BARRIER_STORE;
35 new_top[COUNTER] = original_top[COUNTER] + 1;
36 LFDS710_PAL_ATOMIC_DWCAS( ss->top, original_top, new_top, LFDS710_MISC_CAS_STRENGTH_WEAK, result );
39 LFDS710_BACKOFF_EXPONENTIAL_BACKOFF( ss->push_backoff, backoff_iteration );
43 LFDS710_BACKOFF_AUTOTUNE( ss->push_backoff, backoff_iteration );