comparison src/share/vm/gc_implementation/g1/satbQueue.hpp @ 23030:399885e13e90

8075215: SATB buffer processing found reclaimed humongous object Summary: Don't assume SATB buffer entries are valid objects Reviewed-by: brutisso, ecaspole
author kbarrett
date Fri, 01 May 2015 17:38:12 -0400
parents 0f8f1250fed5
children dd9cc155639c
comparison
equal deleted inserted replaced
23029:0f8f1250fed5 23030:399885e13e90
23 */ 23 */
24 24
25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP 25 #ifndef SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP
26 #define SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP 26 #define SHARE_VM_GC_IMPLEMENTATION_G1_SATBQUEUE_HPP
27 27
28 #include "memory/allocation.hpp"
28 #include "gc_implementation/g1/ptrQueue.hpp" 29 #include "gc_implementation/g1/ptrQueue.hpp"
29 30
30 class ObjectClosure;
31 class JavaThread; 31 class JavaThread;
32 class SATBMarkQueueSet; 32 class SATBMarkQueueSet;
33 33
34 // Base class for processing the contents of a SATB buffer.
35 class SATBBufferClosure : public StackObj {
36 protected:
37 ~SATBBufferClosure() { }
38
39 public:
40 // Process the SATB entries in the designated buffer range.
41 virtual void do_buffer(void** buffer, size_t size) = 0;
42 };
43
34 // A ptrQueue whose elements are "oops", pointers to object heads. 44 // A ptrQueue whose elements are "oops", pointers to object heads.
35 class ObjPtrQueue: public PtrQueue { 45 class ObjPtrQueue: public PtrQueue {
36 friend class Threads;
37 friend class SATBMarkQueueSet; 46 friend class SATBMarkQueueSet;
38 friend class G1RemarkThreadsClosure;
39 47
40 private: 48 private:
41 // Filter out unwanted entries from the buffer. 49 // Filter out unwanted entries from the buffer.
42 void filter(); 50 void filter();
43
44 // Apply the closure to all elements and empty the buffer;
45 void apply_closure_and_empty(ObjectClosure* cl);
46
47 // Apply the closure to all elements of "buf", down to "index" (inclusive.)
48 static void apply_closure_to_buffer(ObjectClosure* cl,
49 void** buf, size_t index, size_t sz);
50 51
51 public: 52 public:
52 ObjPtrQueue(PtrQueueSet* qset, bool perm = false) : 53 ObjPtrQueue(PtrQueueSet* qset, bool perm = false) :
53 // SATB queues are only active during marking cycles. We create 54 // SATB queues are only active during marking cycles. We create
54 // them with their active field set to false. If a thread is 55 // them with their active field set to false. If a thread is
57 // field to true. This is done in JavaThread::initialize_queues(). 58 // field to true. This is done in JavaThread::initialize_queues().
58 PtrQueue(qset, perm, false /* active */) { } 59 PtrQueue(qset, perm, false /* active */) { }
59 60
60 // Process queue entries and free resources. 61 // Process queue entries and free resources.
61 void flush(); 62 void flush();
63
64 // Apply cl to the active part of the buffer.
65 // Prerequisite: Must be at a safepoint.
66 void apply_closure_and_empty(SATBBufferClosure* cl);
62 67
63 // Overrides PtrQueue::should_enqueue_buffer(). See the method's 68 // Overrides PtrQueue::should_enqueue_buffer(). See the method's
64 // definition for more information. 69 // definition for more information.
65 virtual bool should_enqueue_buffer(); 70 virtual bool should_enqueue_buffer();
66 71
95 void set_active_all_threads(bool active, bool expected_active); 100 void set_active_all_threads(bool active, bool expected_active);
96 101
97 // Filter all the currently-active SATB buffers. 102 // Filter all the currently-active SATB buffers.
98 void filter_thread_buffers(); 103 void filter_thread_buffers();
99 104
100 // If there exists some completed buffer, pop it, then apply the 105 // If there exists some completed buffer, pop and process it, and
101 // closure to all its elements, and return true. If no 106 // return true. Otherwise return false. Processing a buffer
102 // completed buffers exist, return false. 107 // consists of applying the closure to the buffer range starting
103 bool apply_closure_to_completed_buffer(ObjectClosure* closure); 108 // with the first non-NULL entry to the end of the buffer; the
109 // leading entries may be NULL due to filtering.
110 bool apply_closure_to_completed_buffer(SATBBufferClosure* cl);
104 111
105 #ifndef PRODUCT 112 #ifndef PRODUCT
106 // Helpful for debugging 113 // Helpful for debugging
107 void print_all(const char* msg); 114 void print_all(const char* msg);
108 #endif // PRODUCT 115 #endif // PRODUCT