diff options
author | Stefan Fritsch <sf@sfritsch.de> | 2011-12-27 19:42:22 +0100 |
---|---|---|
committer | Stefan Fritsch <sf@sfritsch.de> | 2011-12-27 19:42:22 +0100 |
commit | 0268977037115539ad65a26e858aa0df8d18cd13 (patch) | |
tree | f761b541b04d08b75e32efc6c293111c61a8b79c /server/mpm/experimental | |
parent | 9e615cb6aa4afcee97f8a1646e5a586261a7b81f (diff) | |
download | apache2-0268977037115539ad65a26e858aa0df8d18cd13.tar.gz |
Upstream tarball 2.2.9upstream/2.2.9
Diffstat (limited to 'server/mpm/experimental')
-rw-r--r-- | server/mpm/experimental/event/fdqueue.c | 10 |
1 files changed, 8 insertions, 2 deletions
diff --git a/server/mpm/experimental/event/fdqueue.c b/server/mpm/experimental/event/fdqueue.c index c0ef9bbb..5a1baa94 100644 --- a/server/mpm/experimental/event/fdqueue.c +++ b/server/mpm/experimental/event/fdqueue.c @@ -194,10 +194,16 @@ void ap_push_pool(fd_queue_info_t * queue_info, (*new_recycle)); new_recycle->pool = pool_to_recycle; for (;;) { - new_recycle->next = queue_info->recycled_pools; + /* + * Save queue_info->recycled_pool in local variable next because + * new_recycle->next can be changed after apr_atomic_casptr + * function call. For gory details see PR 44402. + */ + struct recycled_pool *next = queue_info->recycled_pools; + new_recycle->next = next; if (apr_atomic_casptr ((volatile void **) &(queue_info->recycled_pools), - new_recycle, new_recycle->next) == new_recycle->next) { + new_recycle, next) == next) { break; } } |