src/share/vm/gc_implementation/g1/satbQueue.hpp

Sat, 06 Oct 2012 01:17:44 -0700

author
johnc
date
Sat, 06 Oct 2012 01:17:44 -0700
changeset 4173
8a5ea0a9ccc4
parent 3416
2ace1c4ee8da
child 6396
f99e331f6ef6
permissions
-rw-r--r--

7127708: G1: change task num types from int to uint in concurrent mark
Summary: Change the type of various task num fields, parameters etc to unsigned and rename them to be more consistent with the other collectors. Code changes were also reviewed by Vitaly Davidovich.
Reviewed-by: johnc
Contributed-by: Kaushik Srenevasan <kaushik@twitter.com>

     1 /*
     2  * Copyright (c) 2001, 2012, 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 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP
    26 #define SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP
    28 #include "gc_implementation/g1/ptrQueue.hpp"
    30 class ObjectClosure;
    31 class JavaThread;
    32 class SATBMarkQueueSet;
    34 // A ptrQueue whose elements are "oops", pointers to object heads.
    35 class ObjPtrQueue: public PtrQueue {
    36   friend class SATBMarkQueueSet;
    38 private:
    39   // Filter out unwanted entries from the buffer.
    40   void filter();
    42   // Apply the closure to all elements.
    43   void apply_closure(ObjectClosure* cl);
    45   // Apply the closure to all elements and empty the buffer;
    46   void apply_closure_and_empty(ObjectClosure* cl);
    48   // Apply the closure to all elements of "buf", down to "index" (inclusive.)
    49   static void apply_closure_to_buffer(ObjectClosure* cl,
    50                                       void** buf, size_t index, size_t sz);
    52 public:
    53   ObjPtrQueue(PtrQueueSet* qset, bool perm = false) :
    54     // SATB queues are only active during marking cycles. We create
    55     // them with their active field set to false. If a thread is
    56     // created during a cycle and its SATB queue needs to be activated
    57     // before the thread starts running, we'll need to set its active
    58     // field to true. This is done in JavaThread::initialize_queues().
    59     PtrQueue(qset, perm, false /* active */) { }
    61   // Overrides PtrQueue::flush() so that it can filter the buffer
    62   // before it is flushed.
    63   virtual void flush();
    65   // Overrides PtrQueue::should_enqueue_buffer(). See the method's
    66   // definition for more information.
    67   virtual bool should_enqueue_buffer();
    69 #ifndef PRODUCT
    70   // Helpful for debugging
    71   void print(const char* name);
    72   static void print(const char* name, void** buf, size_t index, size_t sz);
    73 #endif // PRODUCT
    75   void verify_oops_in_buffer() NOT_DEBUG_RETURN;
    76 };
    78 class SATBMarkQueueSet: public PtrQueueSet {
    79   ObjectClosure* _closure;
    80   ObjectClosure** _par_closures;  // One per ParGCThread.
    82   ObjPtrQueue _shared_satb_queue;
    84   // Utility function to support sequential and parallel versions.  If
    85   // "par" is true, then "worker" is the par thread id; if "false", worker
    86   // is ignored.
    87   bool apply_closure_to_completed_buffer_work(bool par, int worker);
    89 #ifdef ASSERT
    90   void dump_active_values(JavaThread* first, bool expected_active);
    91 #endif // ASSERT
    93 public:
    94   SATBMarkQueueSet();
    96   void initialize(Monitor* cbl_mon, Mutex* fl_lock,
    97                   int process_completed_threshold,
    98                   Mutex* lock);
   100   static void handle_zero_index_for_thread(JavaThread* t);
   102   // Apply "set_active(b)" to all Java threads' SATB queues. It should be
   103   // called only with the world stopped. The method will assert that the
   104   // SATB queues of all threads it visits, as well as the SATB queue
   105   // set itself, has an active value same as expected_active.
   106   void set_active_all_threads(bool b, bool expected_active);
   108   // Filter all the currently-active SATB buffers.
   109   void filter_thread_buffers();
   111   // Register "blk" as "the closure" for all queues.  Only one such closure
   112   // is allowed.  The "apply_closure_to_completed_buffer" method will apply
   113   // this closure to a completed buffer, and "iterate_closure_all_threads"
   114   // applies it to partially-filled buffers (the latter should only be done
   115   // with the world stopped).
   116   void set_closure(ObjectClosure* closure);
   117   // Set the parallel closures: pointer is an array of pointers to
   118   // closures, one for each parallel GC thread.
   119   void set_par_closure(int i, ObjectClosure* closure);
   121   // Apply the registered closure to all entries on each
   122   // currently-active buffer and then empty the buffer. It should only
   123   // be called serially and at a safepoint.
   124   void iterate_closure_all_threads();
   125   // Parallel version of the above.
   126   void par_iterate_closure_all_threads(int worker);
   128   // If there exists some completed buffer, pop it, then apply the
   129   // registered closure to all its elements, and return true.  If no
   130   // completed buffers exist, return false.
   131   bool apply_closure_to_completed_buffer() {
   132     return apply_closure_to_completed_buffer_work(false, 0);
   133   }
   134   // Parallel version of the above.
   135   bool par_apply_closure_to_completed_buffer(int worker) {
   136     return apply_closure_to_completed_buffer_work(true, worker);
   137   }
   139   // Apply the given closure on enqueued and currently-active buffers
   140   // respectively. Both methods are read-only, i.e., they do not
   141   // modify any of the buffers.
   142   void iterate_completed_buffers_read_only(ObjectClosure* cl);
   143   void iterate_thread_buffers_read_only(ObjectClosure* cl);
   145 #ifndef PRODUCT
   146   // Helpful for debugging
   147   void print_all(const char* msg);
   148 #endif // PRODUCT
   150   ObjPtrQueue* shared_satb_queue() { return &_shared_satb_queue; }
   152   // If a marking is being abandoned, reset any unprocessed log buffers.
   153   void abandon_partial_marking();
   154 };
   156 #endif // SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP

mercurial