src/share/vm/gc_implementation/parallelScavenge/psCompactionManager.hpp

Tue, 28 Sep 2010 15:56:15 -0700

author
jcoomes
date
Tue, 28 Sep 2010 15:56:15 -0700
changeset 2191
894b1d7c7e01
parent 1993
b2a00dd3117c
child 2314
f95d63e2154a
permissions
-rw-r--r--

6423256: GC stacks should use a better data structure
6942771: SEGV in ParScanThreadState::take_from_overflow_stack
Reviewed-by: apetrusenko, ysr, pbk

     1 /*
     2  * Copyright (c) 2005, 2010, Oracle and/or its affiliates. All rights reserved.
     3  * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
     4  *
     5  * This code is free software; you can redistribute it and/or modify it
     6  * under the terms of the GNU General Public License version 2 only, as
     7  * published by the Free Software Foundation.
     8  *
     9  * This code is distributed in the hope that it will be useful, but WITHOUT
    10  * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
    11  * FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
    12  * version 2 for more details (a copy is included in the LICENSE file that
    13  * accompanied this code).
    14  *
    15  * You should have received a copy of the GNU General Public License version
    16  * 2 along with this work; if not, write to the Free Software Foundation,
    17  * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
    18  *
    19  * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
    20  * or visit www.oracle.com if you need additional information or have any
    21  * questions.
    22  *
    23  */
    25 // Move to some global location
    26 #define HAS_BEEN_MOVED 0x1501d01d
    27 // End move to some global location
    30 class MutableSpace;
    31 class PSOldGen;
    32 class ParCompactionManager;
    33 class ObjectStartArray;
    34 class ParallelCompactData;
    35 class ParMarkBitMap;
    37 class ParCompactionManager : public CHeapObj {
    38   friend class ParallelTaskTerminator;
    39   friend class ParMarkBitMap;
    40   friend class PSParallelCompact;
    41   friend class StealRegionCompactionTask;
    42   friend class UpdateAndFillClosure;
    43   friend class RefProcTaskExecutor;
    45  public:
    47 // ------------------------  Don't putback if not needed
    48   // Actions that the compaction manager should take.
    49   enum Action {
    50     Update,
    51     Copy,
    52     UpdateAndCopy,
    53     CopyAndUpdate,
    54     VerifyUpdate,
    55     ResetObjects,
    56     NotValid
    57   };
    58 // ------------------------  End don't putback if not needed
    60  private:
    61   // 32-bit:  4K * 8 = 32KiB; 64-bit:  8K * 16 = 128KiB
    62   #define QUEUE_SIZE (1 << NOT_LP64(12) LP64_ONLY(13))
    63   typedef OverflowTaskQueue<ObjArrayTask, QUEUE_SIZE> ObjArrayTaskQueue;
    64   typedef GenericTaskQueueSet<ObjArrayTaskQueue>      ObjArrayTaskQueueSet;
    65   #undef QUEUE_SIZE
    67   static ParCompactionManager** _manager_array;
    68   static OopTaskQueueSet*       _stack_array;
    69   static ObjArrayTaskQueueSet*  _objarray_queues;
    70   static ObjectStartArray*      _start_array;
    71   static RegionTaskQueueSet*    _region_array;
    72   static PSOldGen*              _old_gen;
    74 private:
    75   OverflowTaskQueue<oop>        _marking_stack;
    76   ObjArrayTaskQueue             _objarray_stack;
    78   // Is there a way to reuse the _marking_stack for the
    79   // saving empty regions?  For now just create a different
    80   // type of TaskQueue.
    81   RegionTaskQueue               _region_stack;
    83   Stack<Klass*>                 _revisit_klass_stack;
    84   Stack<DataLayout*>            _revisit_mdo_stack;
    86   static ParMarkBitMap* _mark_bitmap;
    88   Action _action;
    90   static PSOldGen* old_gen()             { return _old_gen; }
    91   static ObjectStartArray* start_array() { return _start_array; }
    92   static OopTaskQueueSet* stack_array()  { return _stack_array; }
    94   static void initialize(ParMarkBitMap* mbm);
    96  protected:
    97   // Array of tasks.  Needed by the ParallelTaskTerminator.
    98   static RegionTaskQueueSet* region_array()      { return _region_array; }
    99   OverflowTaskQueue<oop>*  marking_stack()       { return &_marking_stack; }
   100   RegionTaskQueue* region_stack()                { return &_region_stack; }
   102   // Pushes onto the marking stack.  If the marking stack is full,
   103   // pushes onto the overflow stack.
   104   void stack_push(oop obj);
   105   // Do not implement an equivalent stack_pop.  Deal with the
   106   // marking stack and overflow stack directly.
   108  public:
   109   Action action() { return _action; }
   110   void set_action(Action v) { _action = v; }
   112   inline static ParCompactionManager* manager_array(int index);
   114   ParCompactionManager();
   116   ParMarkBitMap* mark_bitmap() { return _mark_bitmap; }
   118   // Take actions in preparation for a compaction.
   119   static void reset();
   121   // void drain_stacks();
   123   bool should_update();
   124   bool should_copy();
   125   bool should_verify_only();
   126   bool should_reset_only();
   128   Stack<Klass*>* revisit_klass_stack() { return &_revisit_klass_stack; }
   129   Stack<DataLayout*>* revisit_mdo_stack() { return &_revisit_mdo_stack; }
   131   // Save for later processing.  Must not fail.
   132   inline void push(oop obj) { _marking_stack.push(obj); }
   133   inline void push_objarray(oop objarray, size_t index);
   134   inline void push_region(size_t index);
   136   // Access function for compaction managers
   137   static ParCompactionManager* gc_thread_compaction_manager(int index);
   139   static bool steal(int queue_num, int* seed, oop& t) {
   140     return stack_array()->steal(queue_num, seed, t);
   141   }
   143   static bool steal_objarray(int queue_num, int* seed, ObjArrayTask& t) {
   144     return _objarray_queues->steal(queue_num, seed, t);
   145   }
   147   static bool steal(int queue_num, int* seed, size_t& region) {
   148     return region_array()->steal(queue_num, seed, region);
   149   }
   151   // Process tasks remaining on any marking stack
   152   void follow_marking_stacks();
   153   inline bool marking_stacks_empty() const;
   155   // Process tasks remaining on any stack
   156   void drain_region_stacks();
   158 };
   160 inline ParCompactionManager* ParCompactionManager::manager_array(int index) {
   161   assert(_manager_array != NULL, "access of NULL manager_array");
   162   assert(index >= 0 && index <= (int)ParallelGCThreads,
   163     "out of range manager_array access");
   164   return _manager_array[index];
   165 }
   167 bool ParCompactionManager::marking_stacks_empty() const {
   168   return _marking_stack.is_empty() && _objarray_stack.is_empty();
   169 }

mercurial