Mercurial > hg > graal-jvmci-8
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 |