diff options
author | singler <singler@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-09-17 08:42:39 +0000 |
---|---|---|
committer | singler <singler@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-09-17 08:42:39 +0000 |
commit | 84ec5566784efbac633966ca76a31eca3160dcc0 (patch) | |
tree | 11ed989c17b3740ffef24792c7397b0fbce1f891 /libstdc++-v3/include/parallel/queue.h | |
parent | 9dbb96fec5e08762f97dda771522283f1fe9710f (diff) | |
download | gcc-84ec5566784efbac633966ca76a31eca3160dcc0.tar.gz |
2009-09-17 Johannes Singler <singler@ira.uka.de>
* include/parallel/algobase.h: Replace tabs by spaces;
correct line breaks.
* include/parallel/algorithmfwd.h: Likewise.
* include/parallel/balanced_quicksort.h: Likewise.
* include/parallel/base.h: Likewise.
* include/parallel/checkers.h: Likewise.
* include/parallel/compatibility.h: Likewise.
* include/parallel/equally_split.h: Likewise.
* include/parallel/find.h: Likewise.
* include/parallel/for_each.h: Likewise.
* include/parallel/for_each_selectors.h: Likewise.
* include/parallel/iterator.h: Likewise.
* include/parallel/list_partition.h: Likewise.
* include/parallel/losertree.h: Likewise.
* include/parallel/merge.h: Likewise.
* include/parallel/multiseq_selection.h: Likewise.
* include/parallel/multiway_merge.h: Likewise.
* include/parallel/multiway_mergesort.h: Likewise.
* include/parallel/numeric: Likewise.
* include/parallel/numericfwd.h: Likewise.
* include/parallel/omp_loop.h: Likewise.
* include/parallel/omp_loop_static.h: Likewise.
* include/parallel/par_loop.h: Likewise.
* include/parallel/partial_sum.h: Likewise.
* include/parallel/partition.h: Likewise.
* include/parallel/queue.h: Likewise.
* include/parallel/quicksort.h: Likewise.
* include/parallel/random_number.h: Likewise.
* include/parallel/random_shuffle.h: Likewise.
* include/parallel/search.h: Likewise.
* include/parallel/set_operations.h: Likewise.
* include/parallel/settings.h: Likewise.
* include/parallel/sort.h: Likewise.
* include/parallel/types.h: Likewise.
* include/parallel/unique_copy.h: Likewise.
* include/parallel/workstealing.h: Likewise.
* include/parallel/algo.h: Likewise;
shorten _ForwardIterator to _FIterator.
* include/parallel/find_selectors.h: Likewise.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151791 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'libstdc++-v3/include/parallel/queue.h')
-rw-r--r-- | libstdc++-v3/include/parallel/queue.h | 94 |
1 files changed, 50 insertions, 44 deletions
diff --git a/libstdc++-v3/include/parallel/queue.h b/libstdc++-v3/include/parallel/queue.h index 587fa5312e2..348bb1ac900 100644 --- a/libstdc++-v3/include/parallel/queue.h +++ b/libstdc++-v3/include/parallel/queue.h @@ -59,7 +59,7 @@ namespace __gnu_parallel _SequenceIndex _M_max_size; /** @brief Cyclic __begin and __end pointers contained in one - atomically changeable value. */ + atomically changeable value. */ _GLIBCXX_VOLATILE _CASable _M_borders; public: @@ -67,9 +67,9 @@ namespace __gnu_parallel * @param _M_max_size Maximal number of elements to be contained. */ _RestrictedBoundedConcurrentQueue(_SequenceIndex _M_max_size) { - this->_M_max_size = _M_max_size; - _M_base = new _Tp[_M_max_size]; - _M_borders = __encode2(0, 0); + this->_M_max_size = _M_max_size; + _M_base = new _Tp[_M_max_size]; + _M_borders = __encode2(0, 0); #pragma omp flush } @@ -82,16 +82,16 @@ namespace __gnu_parallel void push_front(const _Tp& __t) { - _CASable __former_borders = _M_borders; - int __former_front, __former_back; - decode2(__former_borders, __former_front, __former_back); - *(_M_base + __former_front % _M_max_size) = __t; + _CASable __former_borders = _M_borders; + int __former_front, __former_back; + decode2(__former_borders, __former_front, __former_back); + *(_M_base + __former_front % _M_max_size) = __t; #if _GLIBCXX_ASSERTIONS - // Otherwise: front - back > _M_max_size eventually. - _GLIBCXX_PARALLEL_ASSERT(((__former_front + 1) - __former_back) - <= _M_max_size); + // Otherwise: front - back > _M_max_size eventually. + _GLIBCXX_PARALLEL_ASSERT(((__former_front + 1) - __former_back) + <= _M_max_size); #endif - __fetch_and_add(&_M_borders, __encode2(1, 0)); + __fetch_and_add(&_M_borders, __encode2(1, 0)); } /** @brief Pops one element from the queue at the front end. @@ -99,50 +99,56 @@ namespace __gnu_parallel bool pop_front(_Tp& __t) { - int __former_front, __former_back; + int __former_front, __former_back; #pragma omp flush - decode2(_M_borders, __former_front, __former_back); - while (__former_front > __former_back) - { - // Chance. - _CASable __former_borders = __encode2(__former_front, __former_back); - _CASable __new_borders = __encode2(__former_front - 1, __former_back); - if (__compare_and_swap(&_M_borders, __former_borders, __new_borders)) - { - __t = *(_M_base + (__former_front - 1) % _M_max_size); - return true; - } + decode2(_M_borders, __former_front, __former_back); + while (__former_front > __former_back) + { + // Chance. + _CASable + __former_borders = __encode2(__former_front, __former_back); + _CASable + __new_borders = __encode2(__former_front - 1, __former_back); + if (__compare_and_swap( + &_M_borders, __former_borders, __new_borders)) + { + __t = *(_M_base + (__former_front - 1) % _M_max_size); + return true; + } #pragma omp flush - decode2(_M_borders, __former_front, __former_back); - } - return false; + decode2(_M_borders, __former_front, __former_back); + } + return false; } /** @brief Pops one element from the queue at the front end. * Must not be called concurrently with pop_front(). */ bool - pop_back(_Tp& __t) //queue behavior + pop_back(_Tp& __t) //queue behavior { - int __former_front, __former_back; + int __former_front, __former_back; #pragma omp flush - decode2(_M_borders, __former_front, __former_back); - while (__former_front > __former_back) - { - // Chance. - _CASable __former_borders = __encode2(__former_front, __former_back); - _CASable __new_borders = __encode2(__former_front, __former_back + 1); - if (__compare_and_swap(&_M_borders, __former_borders, __new_borders)) - { - __t = *(_M_base + __former_back % _M_max_size); - return true; - } + decode2(_M_borders, __former_front, __former_back); + while (__former_front > __former_back) + { + // Chance. + _CASable + __former_borders = __encode2(__former_front, __former_back); + _CASable + __new_borders = __encode2(__former_front, __former_back + 1); + if (__compare_and_swap( + &_M_borders, __former_borders, __new_borders)) + { + __t = *(_M_base + __former_back % _M_max_size); + return true; + } #pragma omp flush - decode2(_M_borders, __former_front, __former_back); - } - return false; + decode2(_M_borders, __former_front, __former_back); + } + return false; } }; -} //namespace __gnu_parallel +} //namespace __gnu_parallel #undef _GLIBCXX_VOLATILE |