Commit 85a920dd authored by unknown's avatar unknown

different fix for strict-aliasing problem

parent c780abfe
...@@ -416,14 +416,17 @@ static void alloc_free(struct st_lf_alloc_node *first, ...@@ -416,14 +416,17 @@ static void alloc_free(struct st_lf_alloc_node *first,
struct st_lf_alloc_node volatile *last, struct st_lf_alloc_node volatile *last,
LF_ALLOCATOR *allocator) LF_ALLOCATOR *allocator)
{ {
struct st_lf_alloc_node * volatile tmp; /*
tmp= allocator->top; we need a union here to access type-punned pointer reliably.
otherwise gcc -fstrict-aliasing will not see 'tmp' changed in the loop
*/
union { struct st_lf_alloc_node * node; void *ptr; } tmp;
tmp.node= allocator->top;
do do
{ {
last->next= tmp; last->next= tmp.node;
} while (!my_atomic_casptr((void **)(char *)&allocator->top, } while (!my_atomic_casptr((void **)(char *)&allocator->top,
(void **)(char *)&tmp, first) && (void **)&tmp.ptr, first) && LF_BACKOFF);
LF_BACKOFF);
} }
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment