summaryrefslogtreecommitdiff
path: root/libstdc++-v3/include/parallel/queue.h
diff options
context:
space:
mode:
authorsingler <singler@138bc75d-0d04-0410-961f-82ee72b054a4>2009-09-17 08:42:39 +0000
committersingler <singler@138bc75d-0d04-0410-961f-82ee72b054a4>2009-09-17 08:42:39 +0000
commit84ec5566784efbac633966ca76a31eca3160dcc0 (patch)
tree11ed989c17b3740ffef24792c7397b0fbce1f891 /libstdc++-v3/include/parallel/queue.h
parent9dbb96fec5e08762f97dda771522283f1fe9710f (diff)
downloadgcc-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.h94
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