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

Mon, 20 Sep 2010 14:38:38 -0700

author
jmasa
date
Mon, 20 Sep 2010 14:38:38 -0700
changeset 2188
8b10f48633dc
parent 1993
b2a00dd3117c
child 2191
894b1d7c7e01
permissions
-rw-r--r--

6984287: Regularize how GC parallel workers are specified.
Summary: Associate number of GC workers with the workgang as opposed to the task.
Reviewed-by: johnc, ysr

     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 #if 1  // does this happen enough to need a per thread stack?
    84   GrowableArray<Klass*>*        _revisit_klass_stack;
    85   GrowableArray<DataLayout*>*   _revisit_mdo_stack;
    86 #endif
    87   static ParMarkBitMap* _mark_bitmap;
    89   Action _action;
    91   static PSOldGen* old_gen()             { return _old_gen; }
    92   static ObjectStartArray* start_array() { return _start_array; }
    93   static OopTaskQueueSet* stack_array()  { return _stack_array; }
    95   static void initialize(ParMarkBitMap* mbm);
    97  protected:
    98   // Array of tasks.  Needed by the ParallelTaskTerminator.
    99   static RegionTaskQueueSet* region_array()      { return _region_array; }
   100   OverflowTaskQueue<oop>*  marking_stack()       { return &_marking_stack; }
   101   RegionTaskQueue* region_stack()                { return &_region_stack; }
   103   // Pushes onto the marking stack.  If the marking stack is full,
   104   // pushes onto the overflow stack.
   105   void stack_push(oop obj);
   106   // Do not implement an equivalent stack_pop.  Deal with the
   107   // marking stack and overflow stack directly.
   109  public:
   110   Action action() { return _action; }
   111   void set_action(Action v) { _action = v; }
   113   inline static ParCompactionManager* manager_array(int index);
   115   ParCompactionManager();
   116   ~ParCompactionManager();
   118   void allocate_stacks();
   119   void deallocate_stacks();
   120   ParMarkBitMap* mark_bitmap() { return _mark_bitmap; }
   122   // Take actions in preparation for a compaction.
   123   static void reset();
   125   // void drain_stacks();
   127   bool should_update();
   128   bool should_copy();
   129   bool should_verify_only();
   130   bool should_reset_only();
   132 #if 1
   133   // Probably stays as a growable array
   134   GrowableArray<Klass*>* revisit_klass_stack() { return _revisit_klass_stack; }
   135   GrowableArray<DataLayout*>* revisit_mdo_stack() { return _revisit_mdo_stack; }
   136 #endif
   138   // Save for later processing.  Must not fail.
   139   inline void push(oop obj) { _marking_stack.push(obj); }
   140   inline void push_objarray(oop objarray, size_t index);
   141   inline void push_region(size_t index);
   143   // Access function for compaction managers
   144   static ParCompactionManager* gc_thread_compaction_manager(int index);
   146   static bool steal(int queue_num, int* seed, oop& t) {
   147     return stack_array()->steal(queue_num, seed, t);
   148   }
   150   static bool steal_objarray(int queue_num, int* seed, ObjArrayTask& t) {
   151     return _objarray_queues->steal(queue_num, seed, t);
   152   }
   154   static bool steal(int queue_num, int* seed, size_t& region) {
   155     return region_array()->steal(queue_num, seed, region);
   156   }
   158   // Process tasks remaining on any marking stack
   159   void follow_marking_stacks();
   160   inline bool marking_stacks_empty() const;
   162   // Process tasks remaining on any stack
   163   void drain_region_stacks();
   165   // Debugging support
   166 #ifdef ASSERT
   167   bool stacks_have_been_allocated();
   168 #endif
   169 };
   171 inline ParCompactionManager* ParCompactionManager::manager_array(int index) {
   172   assert(_manager_array != NULL, "access of NULL manager_array");
   173   assert(index >= 0 && index <= (int)ParallelGCThreads,
   174     "out of range manager_array access");
   175   return _manager_array[index];
   176 }
   178 bool ParCompactionManager::marking_stacks_empty() const {
   179   return _marking_stack.is_empty() && _objarray_stack.is_empty();
   180 }

mercurial