|
|
@ -1,6 +1,6 @@ |
|
|
|
/*
|
|
|
|
/*
|
|
|
|
* |
|
|
|
* |
|
|
|
* Copyright 2015, Google Inc. |
|
|
|
* Copyright 2015-2016, Google Inc. |
|
|
|
* All rights reserved. |
|
|
|
* All rights reserved. |
|
|
|
* |
|
|
|
* |
|
|
|
* Redistribution and use in source and binary forms, with or without |
|
|
|
* Redistribution and use in source and binary forms, with or without |
|
|
@ -99,6 +99,11 @@ gpr_stack_lockfree *gpr_stack_lockfree_create(size_t entries) { |
|
|
|
|
|
|
|
|
|
|
|
/* Point the head at reserved dummy entry */ |
|
|
|
/* Point the head at reserved dummy entry */ |
|
|
|
stack->head.contents.index = INVALID_ENTRY_INDEX; |
|
|
|
stack->head.contents.index = INVALID_ENTRY_INDEX; |
|
|
|
|
|
|
|
/* Fill in the pad and aba_ctr to avoid confusing memcheck tools */ |
|
|
|
|
|
|
|
#ifdef GPR_ARCH_64 |
|
|
|
|
|
|
|
stack->head.contents.pad = 0; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
stack->head.contents.aba_ctr = 0; |
|
|
|
return stack; |
|
|
|
return stack; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -115,6 +120,11 @@ int gpr_stack_lockfree_push(gpr_stack_lockfree *stack, int entry) { |
|
|
|
|
|
|
|
|
|
|
|
/* First fill in the entry's index and aba ctr for new head */ |
|
|
|
/* First fill in the entry's index and aba ctr for new head */ |
|
|
|
newhead.contents.index = (uint16_t)entry; |
|
|
|
newhead.contents.index = (uint16_t)entry; |
|
|
|
|
|
|
|
#ifdef GPR_ARCH_64 |
|
|
|
|
|
|
|
/* Fill in the pad to avoid confusing memcheck tools */ |
|
|
|
|
|
|
|
newhead.contents.pad = 0; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
/* Also post-increment the aba_ctr */ |
|
|
|
/* Also post-increment the aba_ctr */ |
|
|
|
curent.atm = gpr_atm_no_barrier_load(&stack->entries[entry].atm); |
|
|
|
curent.atm = gpr_atm_no_barrier_load(&stack->entries[entry].atm); |
|
|
|
newhead.contents.aba_ctr = ++curent.contents.aba_ctr; |
|
|
|
newhead.contents.aba_ctr = ++curent.contents.aba_ctr; |
|
|
|