src/hotspot/share/gc/shared/taskqueue.inline.hpp
author sjohanss
Thu, 21 Sep 2017 14:32:05 +0200
changeset 47546 64ba55ba8516
parent 47216 71c04702a3d5
child 47634 6a0c42c40cd1
permissions -rw-r--r--
8184286: print_tracing_info() does not use Unified Logging for output Reviewed-by: ehelin, sangheki
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
     1
/*
40655
9f644073d3a0 8157907: Incorrect inclusion of atomic.hpp instead of atomic.inline.hpp
dholmes
parents: 39407
diff changeset
     2
 * Copyright (c) 2015, 2016, Oracle and/or its affiliates. All rights reserved.
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
     3
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
     4
 *
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
     5
 * This code is free software; you can redistribute it and/or modify it
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
     6
 * under the terms of the GNU General Public License version 2 only, as
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
     7
 * published by the Free Software Foundation.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
     8
 *
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
     9
 * This code is distributed in the hope that it will be useful, but WITHOUT
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    10
 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    11
 * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    12
 * version 2 for more details (a copy is included in the LICENSE file that
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    13
 * accompanied this code).
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    14
 *
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    15
 * You should have received a copy of the GNU General Public License version
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    16
 * 2 along with this work; if not, write to the Free Software Foundation,
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    17
 * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    18
 *
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    19
 * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    20
 * or visit www.oracle.com if you need additional information or have any
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    21
 * questions.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    22
 *
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    23
 */
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    24
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30566
diff changeset
    25
#ifndef SHARE_VM_GC_SHARED_TASKQUEUE_INLINE_HPP
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30566
diff changeset
    26
#define SHARE_VM_GC_SHARED_TASKQUEUE_INLINE_HPP
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    27
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30566
diff changeset
    28
#include "gc/shared/taskqueue.hpp"
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    29
#include "memory/allocation.inline.hpp"
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    30
#include "oops/oop.inline.hpp"
40655
9f644073d3a0 8157907: Incorrect inclusion of atomic.hpp instead of atomic.inline.hpp
dholmes
parents: 39407
diff changeset
    31
#include "runtime/atomic.hpp"
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    32
#include "runtime/orderAccess.inline.hpp"
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30566
diff changeset
    33
#include "utilities/debug.hpp"
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30566
diff changeset
    34
#include "utilities/stack.inline.hpp"
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    35
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    36
template <class T, MEMFLAGS F>
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    37
inline GenericTaskQueueSet<T, F>::GenericTaskQueueSet(int n) : _n(n) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    38
  typedef T* GenericTaskQueuePtr;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    39
  _queues = NEW_C_HEAP_ARRAY(GenericTaskQueuePtr, n, F);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    40
  for (int i = 0; i < n; i++) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    41
    _queues[i] = NULL;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    42
  }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    43
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    44
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    45
template<class E, MEMFLAGS F, unsigned int N>
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    46
inline void GenericTaskQueue<E, F, N>::initialize() {
46704
211b3f6b75ef 8182169: ArrayAllocator should take MEMFLAGS as regular parameter
kbarrett
parents: 40655
diff changeset
    47
  _elems = ArrayAllocator<E>::allocate(N, F);
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    48
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    49
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    50
template<class E, MEMFLAGS F, unsigned int N>
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    51
inline GenericTaskQueue<E, F, N>::~GenericTaskQueue() {
37057
03b3e1870228 8151436: Leaner ArrayAllocator and BitMaps
stefank
parents: 31994
diff changeset
    52
  assert(false, "This code is currently never called");
46704
211b3f6b75ef 8182169: ArrayAllocator should take MEMFLAGS as regular parameter
kbarrett
parents: 40655
diff changeset
    53
  ArrayAllocator<E>::free(const_cast<E*>(_elems), N);
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    54
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    55
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    56
template<class E, MEMFLAGS F, unsigned int N>
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    57
bool GenericTaskQueue<E, F, N>::push_slow(E t, uint dirty_n_elems) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    58
  if (dirty_n_elems == N - 1) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    59
    // Actually means 0, so do the push.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    60
    uint localBot = _bottom;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    61
    // g++ complains if the volatile result of the assignment is
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    62
    // unused, so we cast the volatile away.  We cannot cast directly
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    63
    // to void, because gcc treats that as not using the result of the
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    64
    // assignment.  However, casting to E& means that we trigger an
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    65
    // unused-value warning.  So, we cast the E& to void.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    66
    (void)const_cast<E&>(_elems[localBot] = t);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    67
    OrderAccess::release_store(&_bottom, increment_index(localBot));
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    68
    TASKQUEUE_STATS_ONLY(stats.record_push());
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    69
    return true;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    70
  }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    71
  return false;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    72
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    73
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    74
template<class E, MEMFLAGS F, unsigned int N> inline bool
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    75
GenericTaskQueue<E, F, N>::push(E t) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    76
  uint localBot = _bottom;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    77
  assert(localBot < N, "_bottom out of range.");
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    78
  idx_t top = _age.top();
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    79
  uint dirty_n_elems = dirty_size(localBot, top);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    80
  assert(dirty_n_elems < N, "n_elems out of range.");
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    81
  if (dirty_n_elems < max_elems()) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    82
    // g++ complains if the volatile result of the assignment is
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    83
    // unused, so we cast the volatile away.  We cannot cast directly
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    84
    // to void, because gcc treats that as not using the result of the
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    85
    // assignment.  However, casting to E& means that we trigger an
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    86
    // unused-value warning.  So, we cast the E& to void.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    87
    (void) const_cast<E&>(_elems[localBot] = t);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    88
    OrderAccess::release_store(&_bottom, increment_index(localBot));
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    89
    TASKQUEUE_STATS_ONLY(stats.record_push());
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    90
    return true;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    91
  } else {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    92
    return push_slow(t, dirty_n_elems);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    93
  }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    94
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    95
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    96
template <class E, MEMFLAGS F, unsigned int N>
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    97
inline bool OverflowTaskQueue<E, F, N>::push(E t)
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    98
{
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
    99
  if (!taskqueue_t::push(t)) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   100
    overflow_stack()->push(t);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   101
    TASKQUEUE_STATS_ONLY(stats.record_overflow(overflow_stack()->size()));
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   102
  }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   103
  return true;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   104
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   105
39407
2e75eb109278 8152438: Threads may do significant work out of the non-shared overflow buffer
tschatzl
parents: 37057
diff changeset
   106
template <class E, MEMFLAGS F, unsigned int N>
2e75eb109278 8152438: Threads may do significant work out of the non-shared overflow buffer
tschatzl
parents: 37057
diff changeset
   107
inline bool OverflowTaskQueue<E, F, N>::try_push_to_taskqueue(E t) {
2e75eb109278 8152438: Threads may do significant work out of the non-shared overflow buffer
tschatzl
parents: 37057
diff changeset
   108
  return taskqueue_t::push(t);
2e75eb109278 8152438: Threads may do significant work out of the non-shared overflow buffer
tschatzl
parents: 37057
diff changeset
   109
}
2e75eb109278 8152438: Threads may do significant work out of the non-shared overflow buffer
tschatzl
parents: 37057
diff changeset
   110
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   111
// pop_local_slow() is done by the owning thread and is trying to
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   112
// get the last task in the queue.  It will compete with pop_global()
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   113
// that will be used by other threads.  The tag age is incremented
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   114
// whenever the queue goes empty which it will do here if this thread
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   115
// gets the last task or in pop_global() if the queue wraps (top == 0
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   116
// and pop_global() succeeds, see pop_global()).
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   117
template<class E, MEMFLAGS F, unsigned int N>
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   118
bool GenericTaskQueue<E, F, N>::pop_local_slow(uint localBot, Age oldAge) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   119
  // This queue was observed to contain exactly one element; either this
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   120
  // thread will claim it, or a competing "pop_global".  In either case,
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   121
  // the queue will be logically empty afterwards.  Create a new Age value
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   122
  // that represents the empty queue for the given value of "_bottom".  (We
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   123
  // must also increment "tag" because of the case where "bottom == 1",
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   124
  // "top == 0".  A pop_global could read the queue element in that case,
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   125
  // then have the owner thread do a pop followed by another push.  Without
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   126
  // the incrementing of "tag", the pop_global's CAS could succeed,
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   127
  // allowing it to believe it has claimed the stale element.)
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   128
  Age newAge((idx_t)localBot, oldAge.tag() + 1);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   129
  // Perhaps a competing pop_global has already incremented "top", in which
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   130
  // case it wins the element.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   131
  if (localBot == oldAge.top()) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   132
    // No competing pop_global has yet incremented "top"; we'll try to
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   133
    // install new_age, thus claiming the element.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   134
    Age tempAge = _age.cmpxchg(newAge, oldAge);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   135
    if (tempAge == oldAge) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   136
      // We win.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   137
      assert(dirty_size(localBot, _age.top()) != N - 1, "sanity");
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   138
      TASKQUEUE_STATS_ONLY(stats.record_pop_slow());
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   139
      return true;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   140
    }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   141
  }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   142
  // We lose; a completing pop_global gets the element.  But the queue is empty
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   143
  // and top is greater than bottom.  Fix this representation of the empty queue
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   144
  // to become the canonical one.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   145
  _age.set(newAge);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   146
  assert(dirty_size(localBot, _age.top()) != N - 1, "sanity");
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   147
  return false;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   148
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   149
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   150
template<class E, MEMFLAGS F, unsigned int N> inline bool
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   151
GenericTaskQueue<E, F, N>::pop_local(volatile E& t) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   152
  uint localBot = _bottom;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   153
  // This value cannot be N-1.  That can only occur as a result of
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   154
  // the assignment to bottom in this method.  If it does, this method
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   155
  // resets the size to 0 before the next call (which is sequential,
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   156
  // since this is pop_local.)
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   157
  uint dirty_n_elems = dirty_size(localBot, _age.top());
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   158
  assert(dirty_n_elems != N - 1, "Shouldn't be possible...");
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   159
  if (dirty_n_elems == 0) return false;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   160
  localBot = decrement_index(localBot);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   161
  _bottom = localBot;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   162
  // This is necessary to prevent any read below from being reordered
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   163
  // before the store just above.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   164
  OrderAccess::fence();
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   165
  // g++ complains if the volatile result of the assignment is
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   166
  // unused, so we cast the volatile away.  We cannot cast directly
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   167
  // to void, because gcc treats that as not using the result of the
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   168
  // assignment.  However, casting to E& means that we trigger an
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   169
  // unused-value warning.  So, we cast the E& to void.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   170
  (void) const_cast<E&>(t = _elems[localBot]);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   171
  // This is a second read of "age"; the "size()" above is the first.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   172
  // If there's still at least one element in the queue, based on the
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   173
  // "_bottom" and "age" we've read, then there can be no interference with
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   174
  // a "pop_global" operation, and we're done.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   175
  idx_t tp = _age.top();    // XXX
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   176
  if (size(localBot, tp) > 0) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   177
    assert(dirty_size(localBot, tp) != N - 1, "sanity");
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   178
    TASKQUEUE_STATS_ONLY(stats.record_pop());
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   179
    return true;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   180
  } else {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   181
    // Otherwise, the queue contained exactly one element; we take the slow
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   182
    // path.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   183
    return pop_local_slow(localBot, _age.get());
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   184
  }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   185
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   186
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   187
template <class E, MEMFLAGS F, unsigned int N>
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   188
bool OverflowTaskQueue<E, F, N>::pop_overflow(E& t)
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   189
{
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   190
  if (overflow_empty()) return false;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   191
  t = overflow_stack()->pop();
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   192
  return true;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   193
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   194
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   195
template<class E, MEMFLAGS F, unsigned int N>
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   196
bool GenericTaskQueue<E, F, N>::pop_global(volatile E& t) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   197
  Age oldAge = _age.get();
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   198
  // Architectures with weak memory model require a barrier here
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   199
  // to guarantee that bottom is not older than age,
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   200
  // which is crucial for the correctness of the algorithm.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   201
#if !(defined SPARC || defined IA32 || defined AMD64)
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   202
  OrderAccess::fence();
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   203
#endif
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   204
  uint localBot = OrderAccess::load_acquire((volatile juint*)&_bottom);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   205
  uint n_elems = size(localBot, oldAge.top());
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   206
  if (n_elems == 0) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   207
    return false;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   208
  }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   209
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   210
  // g++ complains if the volatile result of the assignment is
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   211
  // unused, so we cast the volatile away.  We cannot cast directly
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   212
  // to void, because gcc treats that as not using the result of the
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   213
  // assignment.  However, casting to E& means that we trigger an
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   214
  // unused-value warning.  So, we cast the E& to void.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   215
  (void) const_cast<E&>(t = _elems[oldAge.top()]);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   216
  Age newAge(oldAge);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   217
  newAge.increment();
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   218
  Age resAge = _age.cmpxchg(newAge, oldAge);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   219
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   220
  // Note that using "_bottom" here might fail, since a pop_local might
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   221
  // have decremented it.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   222
  assert(dirty_size(localBot, newAge.top()) != N - 1, "sanity");
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   223
  return resAge == oldAge;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   224
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   225
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   226
template<class T, MEMFLAGS F> bool
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   227
GenericTaskQueueSet<T, F>::steal_best_of_2(uint queue_num, int* seed, E& t) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   228
  if (_n > 2) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   229
    uint k1 = queue_num;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   230
    while (k1 == queue_num) k1 = TaskQueueSetSuper::randomParkAndMiller(seed) % _n;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   231
    uint k2 = queue_num;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   232
    while (k2 == queue_num || k2 == k1) k2 = TaskQueueSetSuper::randomParkAndMiller(seed) % _n;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   233
    // Sample both and try the larger.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   234
    uint sz1 = _queues[k1]->size();
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   235
    uint sz2 = _queues[k2]->size();
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   236
    if (sz2 > sz1) return _queues[k2]->pop_global(t);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   237
    else return _queues[k1]->pop_global(t);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   238
  } else if (_n == 2) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   239
    // Just try the other one.
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   240
    uint k = (queue_num + 1) % 2;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   241
    return _queues[k]->pop_global(t);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   242
  } else {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   243
    assert(_n == 1, "can't be zero.");
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   244
    return false;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   245
  }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   246
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   247
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   248
template<class T, MEMFLAGS F> bool
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   249
GenericTaskQueueSet<T, F>::steal(uint queue_num, int* seed, E& t) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   250
  for (uint i = 0; i < 2 * _n; i++) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   251
    if (steal_best_of_2(queue_num, seed, t)) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   252
      TASKQUEUE_STATS_ONLY(queue(queue_num)->stats.record_steal(true));
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   253
      return true;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   254
    }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   255
  }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   256
  TASKQUEUE_STATS_ONLY(queue(queue_num)->stats.record_steal(false));
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   257
  return false;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   258
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   259
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   260
template <unsigned int N, MEMFLAGS F>
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   261
inline typename TaskQueueSuper<N, F>::Age TaskQueueSuper<N, F>::Age::cmpxchg(const Age new_age, const Age old_age) volatile {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   262
  return (size_t) Atomic::cmpxchg_ptr((intptr_t)new_age._data,
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   263
                                      (volatile intptr_t *)&_data,
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   264
                                      (intptr_t)old_age._data);
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   265
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   266
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   267
template<class E, MEMFLAGS F, unsigned int N>
31994
3721b7aa3a0d 8079082: VerifyNoCSetOopsClosure is derived twice from Closure
kbarrett
parents: 30764
diff changeset
   268
template<class Fn>
3721b7aa3a0d 8079082: VerifyNoCSetOopsClosure is derived twice from Closure
kbarrett
parents: 30764
diff changeset
   269
inline void GenericTaskQueue<E, F, N>::iterate(Fn fn) {
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   270
  uint iters = size();
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   271
  uint index = _bottom;
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   272
  for (uint i = 0; i < iters; ++i) {
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   273
    index = decrement_index(index);
31994
3721b7aa3a0d 8079082: VerifyNoCSetOopsClosure is derived twice from Closure
kbarrett
parents: 30764
diff changeset
   274
    fn(const_cast<E&>(_elems[index])); // cast away volatility
30566
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   275
  }
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   276
}
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   277
18eb9aa972d0 8076177: Remove usage of stack.inline.hpp functions from taskqueue.hpp
stefank
parents:
diff changeset
   278
30764
fec48bf5a827 8079792: GC directory structure cleanup
pliden
parents: 30566
diff changeset
   279
#endif // SHARE_VM_GC_SHARED_TASKQUEUE_INLINE_HPP